美文网首页
使用sklearn库:KNN算法

使用sklearn库:KNN算法

作者: 还闹不闹 | 来源:发表于2020-05-29 14:31 被阅读0次

模型参数

def KNeighborsClassifier(n_neighbors = 5, weights='uniform', algorithm = '', leaf_size = '30', p = 2, metric = 'minkowski', metric_params = None, n_jobs = None)

  • n_neighbors:这个值就是指 KNN 中的 “K”了。通过调整 K 值,算法会有不同的效果。
  • weights(权重):最普遍的 KNN 算法,无论距离如何、权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:
    'uniform':不管远近权重都一样,就是最普通的 KNN 算法的形式。
    'distance':权重和距离成反比,距离预测目标越近具有越高的权重。
    自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
  • algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式:
    ①暴力法,就是直接计算距离存储比较的那种放松。
    ②使用 kd 树构建 KNN 模型
    ③使用球树构建。
    其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:
    'brute' :蛮力实现
    'kd_tree':KD 树实现 KNN
    'ball_tree':球树实现 KNN
    'auto': 默认参数,自动选择合适的方法构建模型
    不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 'brute'
  • leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的。
    当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。
  • p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。
  • metric:指定距离度量方法,一般都是使用欧式距离。
    • 'euclidean' :欧式距离
    • 'manhattan':曼哈顿距离
    • 'chebyshev':切比雪夫距离
    • 'minkowski': 闵可夫斯基距离,默认参数
  • n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。

案例


数据集

hua_se  huaban_yeshu    huaban_type
101 1   3
102 1   3
103 2   3
104 1   3
105 3   3
106 1   3
107 3   3
109 4   3
110 2   3
101 27  3
102 28  3
103 28  3
104 29  3
105 2   3
106 27  3
107 29  3
109 30  3
110 30  3
101 4   3
102 4   3
103 3   3
104 2   3
105 1   3
106 1   3
107 2   3
109 2   3
110 4   3
101 29  3
102 30  3
103 30  3
104 29  3
105 27  3
106 28  3
107 29  3
109 29  3
110 30  3
1   1   1
2   2   1
3   3   1
4   1   1
5   4   1
6   3   1
7   4   1
9   2   1
8   3   1
10  1   1
6   2   1
7   3   1
3   1   1
5   3   1
5   4   1
2   3   1
3   2   1
2   3   1
2   2   1
10  1   1
9   3   1
7   1   1
9   4   1
4   3   1
6   3   1
3   1   1
7   1   1
1   2   1
8   4   1
10  4   1
10  27  2
9   29  2
8   29  2
7   30  2
5   29  2
6   27  2
4   27  2
3   28  2
1   29  2
2   29  2
10  29  2
9   29  2
8   30  2
7   30  2
5   27  2
6   28  2
4   28  2
3   29  2
1   27  2
2   30  2
10  30  2
9   29  2
8   30  2
7   28  2
5   29  2
6   30  2
4   30  2
3   30  2
1   27  2
2   29  2
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib
from sklearn.impute import SimpleImputer


# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为10000,默认为50
pd.set_option('display.width',10000)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
#
np.set_printoptions(linewidth=1000)

df = pd.read_csv('G:\\rasa_demo\stack\data\\train.csv.txt', sep='\t', encoding='GBK', header=0)
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# imp = SimpleImputer(missing_values=np.nan, strategy='most_frequent', copy=True)
# df = imp.fit_transform(df)
# df = pd.DataFrame(df)
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# # 检查数据中是否有缺失值,以下两种方式均可
# # Flase:对应特征的特征值中无缺失值
# # True:有缺失值
# print(df.isnull().any())
# print(np.isnan(df).any())
# print(np.isfinite(df).all())
# # # 查看缺失值记录
# # df_null = pd.isnull(df)
# # df_null = df[df_null == True]
# # print(df_null)
# # 缺失值处理,以下两种方式均可
# # 删除包含缺失值的行
# df.dropna(inplace=True)
# # # 缺失值填充
# # df.fillna('10.0')
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# print(df.columns)
# print(df[['hua_se','huaban_yeshu']])
# print(df.iloc[:,[0,1]])
print(df.iloc[0:3,[2]])
X = df.iloc[:,[0,1]]
Y = df.iloc[:,[2]]
print(X.shape, Y.shape)
# Y = Y.values.reshape(-1,1)
print(Y.values.ravel())
X_train,X_test,Y_train,Y_test = train_test_split(X, Y.values.ravel(), test_size=0.2, random_state=35)
# print(type(X_test))

knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, Y_train)

result = knn.predict(X_test)
count = 0
for item1,item2 in zip(result, Y_test):
    if item1 == item2:
        count += 1
print('准确率:', float(count)/float(len(Y_test)))

# # 保存训练好的模型
# joblib.dump(knn, 'G:\\rasa_demo\stack\model\model.pkl') # pkl是sklearn默认的保存格式
# print('模型保存成功!')
# # 加载已训练好的模型
# knn_model = joblib.load('G:\\rasa_demo\stack\model\model.pkl')
# pred_y = knn_model.predict(X_test)

pred_x = {'hua_se':12,'huaban_yeshu':27}
tmp = pd.DataFrame(pred_x, index=[0])
print(tmp)
print(knn.predict(tmp))

拓展阅读:
http://www.statr.cn/?p=351

相关文章

  • 使用sklearn库:KNN算法

    模型参数 def KNeighborsClassifier(n_neighbors = 5, weights='u...

  • sklearn 学习 1

    安装sklearn 找到自己需要的库 numpy+mklscipy 简单的代码学习(knn 分类)

  • KNN库简介

    1.scikit-learn 中KNN相关的类库 机器学习经典库scikit-learn中的sklearn.nei...

  • KNN算法实现及其交叉验证

    KNN算法 用NumPy库实现K-nearest neighbors回归或分类。 knn 邻近算法,或者说K最近邻...

  • 2020-08-10--KNN01

    KNN算法的原理介绍KNN算法的一个简单实现(肿瘤分类)将KNN算法封装成函数机器学习套路使用scikit-lea...

  • KNN算法实现及其交叉验证

    KNN算法 用NumPy库实现K-nearest neighbors回归或分类。 邻近算法,或者说K最近邻(kNN...

  • 使用Python实现KMeans算法

    简介 通过使用python语言实现KMeans算法,不使用sklearn标准库。该实验中字母代表的含义如下: p:...

  • 使用sklearn报错ValueError: Expected

    在对模型进行预测时,如使用sklearn中的KNN模型, 会报错 ValueError: Expected 2D ...

  • 机器学习常用python库安装

    安装 sklearn, 常见学习算法,近年也有基于它的自动深度学习库(auto-sklearn) 安装 numpy...

  • 01-sklearn中的KNN

    前言 因为是用sklearn来实现KNN算法,所以基本上只需要调用API就可以了,但是可以理解一个算法的基本流程。...

网友评论

      本文标题:使用sklearn库:KNN算法

      本文链接:https://www.haomeiwen.com/subject/aubxzhtx.html