数据分析模型之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()

posted on 2020-10-25 19:10  勿要  阅读(427)  评论(0)    收藏  举报

导航