K-近邻算法:根据你的邻居来判断你的类别是什么  。建议k值为奇数

思想:如果一个样本在特征空间中的k个最相似的样本中大多数都属于一个类别,则该样本也属于这个类别

欧氏距离:对应坐标轴差值平方和开根号,默认排序是从小到大

K值的选择:

K值过小:容易受到异常点的影响 K值的减小就意味着整体模型变得复杂,容易发生过拟合

K值过大:受到样本均衡的问题 且K值的增大就意味着整体的模型变得简单,欠拟合

解决分类和回归问题:

分类问题:

计算未知样本到每一个训练样本的距离 将训练样本根据距离大小升序排列 取出距离最近的 K 个训练样本 进行多数表决,统计 K 个样本中哪个类别的样本个数最多 将未知的样本归属到出现次数最多的类别

回归问题:计算未知样本到每一个训练样本的距离 将训练样本根据距离大小升序排列 取出距离最近的 K 个训练样本 把这个 K 个样本的目标值计算其平均值 作为将未知的样本预测的值

API实现:

分类api:

  sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)        

  n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数

数据集必须是二维

# 导包 分类api
from sklearn.neighbors import KNeighborsClassifier
# 创建模型对象:n_neighbors为k值
model = KNeighborsClassifier(n_neighbors=3)
# 创建训练集 为二维数据
x_train = [[1], [2], [3], [4], [5]]
# 创建对应的标签
y_train = [0, 0, 0, 0, 1]
# 模型的训练
model.fit(x_train, y_train)
# 创建测试集
x_test = [[6]]
# 模型的预测
y_test = model.predict(x_test)
print(f'预测的结果是{y_test}')

回归API:求平均值

from sklearn.neighbors import KNeighborsRegressor

# 导包 回归问题
from sklearn.neighbors import KNeighborsRegressor

# 实例化对象
model = KNeighborsRegressor(n_neighbors=3)
# 创建训练数据
x_train = [
    [0, 0, 1],
    [12, 13, 14],
    [5, 6, 7],
    [9, 10, 5]
]
# 创建训练标签
y_train = [0.1, 0.2, 0.3, 0.4]
# 创建测试数据
x_text = [[10, 11, 12]]
# 模型训练
model.fit(x_train, y_train)
# 模型的预测
y_test = model.predict(x_text)
print(f'预测的结果是{y_test}')

距离度量:常见的距离公式,knn算法默认使用欧式距离

欧氏距离:对应坐标轴差值平方和开根号,默认排序是从小到大

曼哈顿距离:对应坐标轴差值的绝对值求和

举个例子: ABCD四点 X=[ [1,1], [2,2], [3,3], [4,4] ] , 计算AB AC AD BC BD曼哈顿距离            经计算得: AB =|2−1|+ ⌈2−1⌉= 2         d = 2 4 6 2 4 2

切比雪夫距离:计算的是坐标轴差值的绝对值中的最大值

国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。 国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。

举个例子: ABCD四点 X=[ [1,1], [2,2], [3,3], [4,4] ] , 计算AB AC AD BC BD切比雪夫距离            经计算得: AB =max(|2−1|, ⌈2−1⌉) = 1         d = 1 2 3 1 2 1

闵可夫斯基距离:闵式距离,不是一个新的距离度量方式而是一个通项公式

p=1为曼哈顿距离,p=2为欧式距离,p为其他时为切比雪夫距离

特征工程:特征的预处理(归一化和标准化)

为什么进行特征的预处理:特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些模型(算法)无法学习到其它的特征。

归一化:通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间

x:当前列的当前值,min:为这一列的最小值 max:为这一列的最大值

mx=1,mi=0默认为[0,1]

弊端:强烈依赖于该列的最大值最小值,如果差值过大计算效果不明显,适用于小数据集

API:

sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )        feature_range 缩放区间 2. fit_transform(X) 将特征进行归一化缩放

# 导包
from sklearn.preprocessing import MinMaxScaler
# 准备数据
data = [[90, 2, 10, 40],
            [60, 4, 15, 45],
            [75, 3, 13, 46]]
# 创建对象
transfer=MinMaxScaler(feature_range=(3, 5))
# 对数据进行归一化
new=transfer.fit_transform(data)
print(new)

标准化:通过对原始数据进行标准化,转换为均值为0标准差为1的标准正态分布的数据

x:为当前列的当前值,mean为这一列的平均值 ,σ 为特征的标准差

标准差为:方差的开平发根

方差:该列的每一个值和该列的均值差值的平方和的平均值

API:1.sklearn.preprocessing. StandardScaler() 2. fit_transform(X) 将特征进行归一化缩放

# 导包
from sklearn.preprocessing import StandardScaler
# 准备数据
data = [[90, 2, 10, 40],
            [60, 4, 15, 45],
            [75, 3, 13, 46]]
# 创建对象
transfer=StandardScaler()
# 使用方法
new_data=transfer.fit_transform(data)
# 输出
print(f'标准化后的数据{new_data}')
print(f'平均值{transfer.mean_}')
print(f'方差值{transfer.var_}')
print(f'标注差值{transfer.scale_}')

适用于大数据场景

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐