数据分析模型之K邻近模型
K邻近模型
既可以预测分类问题,也适用于连续性变量预测问题
对于离散型的因变量时,在k个已知类别样本总挑选出频率最高的类别用于位置样本的判断。
对于连续性的因变量时,将k个最近的一直样本均值用作为止样本的预测。
K值的选择
由于K值的不稳定型会直接影响预测值的偏差。所以可以在KNN算法中添加其他处理方法,来稳定K值:
1.权重:如果已知样本距离未知样本⽐较远,则对应的权重就设置得低⼀些,否则权重就⾼⼀些,通常可以将权重设置为距离的倒数。(距离越近,权重越大)
2.交叉检验法
3.混合使用(更加稳定)
度量距离
欧式距离:在标准坐标系上两点间直线距离(就是勾股定理的斜边长度)
曼哈顿距离:在标准坐标系上两个点的绝对轴距总和
Python函数:
neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform',p=2, metric='minkowski',)
n_neighbors:⽤于指定近邻样本个数K,默认为5
weights:⽤于指定近邻样本的投票权重,默认为'uniform',表示所有近邻样本的投票权重⼀样;如果
为'distance',则表示投票权重与距离成反⽐,即近邻样本与未知类别的样本点距离越远,权重越⼩,
反之,权重越⼤
metric:⽤于指定距离的度量指标,默认为闵可夫斯基距离
p:当参数metric为闵可夫斯基距离时,p=1,表示计算点之间的曼哈顿距离;p=2,表示计算点之间
的欧⽒距离;该参数的默认值为2
代码:
# 导⼊数据
Knowledge = pd.read_excel(r'C:\Users\Administrator\Desktop\Knowledge.xlsx’)
# 拆分数据
X_train, X_test, y_train, y_test = model_selection.train_test_split(Knowledge[predictors],Knowledge.UNS,
test_size = 0.25,
random_state = 1234)
# 设置待测试的不同k值
K = np.arange(1,np.ceil(np.log2(Knowledge.shape[0])))
# 构建空的列表,⽤于存储平均准确率
accuracy = []
for k in K:
# 使⽤10重交叉验证的⽅法,⽐对每⼀个k值下KNN模型的预测准确率
cv_result = model_selection.cross_val_score(neighbors.KNeighborsClassifier(n_neighbors = k,
weights = 'distance’,
X_train, y_train, cv = 10, scoring='accuracy')
accuracy.append(cv_result.mean())
# 折线图
# 从k个平均准确率中挑选出最⼤值所对应的下标
arg_max = np.array(accuracy).argmax()
# 中⽂和负号的正常显示
plt.rcParams[‘font.sans-serif’] = [‘Microsoft YaHei']
plt.rcParams[‘axes.unicode_minus’] = False
# 绘制不同K值与平均预测准确率之间的折线图
plt.plot(K, accuracy)
# 添加点图
plt.scatter(K, accuracy)
# 添加⽂字说明
plt.text(K[arg_max], accuracy[arg_max],’最佳k值为%s’ %int(K[arg_max]))
# 显示图形
plt.show()
浙公网安备 33010602011771号