08-KNN

作者: 郑元吉 | 来源:发表于2018-12-22 10:46 被阅读15次

    一.机器学习原理

    • 原理


      机器学习原理.png
    • 常见名词

    训练数据

    二.机器学习分类

    2.1 有监督学习
    • 分类

    K近邻、朴素贝叶斯、决策树、SVM

    • 回归

    线性回归、逻辑回归、岭回归

    2.2 无监督学习
    • 聚类

    K-means

    2.3 半监督学习

    深度学习

    三.k-近邻算法原理

    简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类(k-Nearest Neighbor,KNN)

    优点:精度高、对异常值不敏感、无数据输入假定。
    缺点:时间复杂度高、空间复杂度高。

    1、当样本不平衡时,比如一个类的样本容量很大,其他类的样本容量很小,输入一个样本的时候,K 个临近值中大多数都是大样本容量的那个类,这时可能就会导致分类错误。改进方法是对K临近点进行加权,也就是距离近的点的权值大,距离远的点权值小。
    2、计算量较大,每个待分类的样本都要计算它到全部点的距离,根据距离排序才能求得K个临近点,改进方法是:先对已知样本点进行剪辑,事先去除对分类作用不大的样本。

    适用数据范围:数值型和标称型

    标称型:标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类)
    数值型:数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析)

    • 工作原理


      K邻近法.png

    四.入门案例

    • KN
    from sklearn.neighbors import KNeighborsClassifier
    
    neigh = KNeighborsClassifier(n_neighbors=3)
    
    #身高、体重、鞋的尺寸
    X = np.array([[181,80,44],[177,70,43],[160,60,38],[154,54,37],
         [166,65,40],[190,90,47],[175,64,39],[177,70,40],
         [159,55,37],[171,75,42],[181,85,43]])
    display(X)
    
    y = ['male','male','female','female','male','male','female','female','female','male','male']
    
    # 第1步:训练数据
    neigh.fit(X,y)
    
    # 第2步:预测数据
    Z = neigh.predict(np.array([[190,70,43],[168,55,37]]))
    
    display(Z)
    

    五.用于分类

    5.1 用于分类的numpy方法介绍
    • np.meshgrid
      从坐标向量返回坐标矩阵
    import numpy as np
    nx, ny = 3, 4
    x = np.linspace(0, 1, nx)
    y = np.linspace(0, 1, ny)
    xv, yv = np.meshgrid(x, y)
    display(x,y,xv,yv)
    
    
    输出:
    array([ 0. ,  0.5,  1. ])
    array([ 0.        ,  0.33333333,  0.66666667,  1.        ])
    array([[ 0. ,  0.5,  1. ],
           [ 0. ,  0.5,  1. ],
           [ 0. ,  0.5,  1. ],
           [ 0. ,  0.5,  1. ]])
    array([[ 0.        ,  0.        ,  0.        ],
           [ 0.33333333,  0.33333333,  0.33333333],
           [ 0.66666667,  0.66666667,  0.66666667],
           [ 1.        ,  1.        ,  1.        ]])
    
    • np.ravel
      返回一个连续的平坦矩阵
    x = np.array([[1, 2, 3], [4, 5, 6]])
    display(x,x.ravel())
    
    输出:
    array([[1, 2, 3],
           [4, 5, 6]])
    array([1, 2, 3, 4, 5, 6])
    
    • np.c_
      将切片对象按第二轴转换为串联
    np.c_[np.array([1,2,3]), np.array([4,5,6])]
    
    输出:
    array([[1, 4],
           [2, 5],
           [3, 6]])
    
    5.2 具体操作

    1)导包

    # 导入库:KNeighborsClassifier
    import numpy as np
    from sklearn.neighbors import KNeighborsClassifier
    import matplotlib.pyplot as plt
    from matplotlib.colors import ListedColormap
    
    # 导入sklearn自带数据集
    from sklearn import datasets
    

    2)获取数据

    # 得到训练样本
    iris = datasets.load_iris()
    X = iris.data[:,:2]
    y = iris.target
    

    3)绘制图形

    #定义三种颜色代表三种蓝蝴蝶
    cmap_species = ListedColormap(['#FF0000','#00FF00','#0000FF'])
    plt.scatter(X[:,0],X[:,1],c = y,cmap = cmap_species)
    plt.show()
    
    绘制图形.png

    4)KNN

    #定义KNN分类器
    clf = KNeighborsClassifier(n_neighbors=10)
    

    5)训练数据

    # 第1步:训练分类器
    clf.fit(X,y)
    

    6)预测数据

    # 图片的显示范围
    x_min, x_max = X[:,0].min()-1, X[:,0].max()+1
    y_min, y_max = X[:,1].min()-1, X[:,1].max()+1
    
    # 图片的背景显示坐标
    xx,yy = np.meshgrid(np.arange(x_min,x_max,0.02),np.arange(y_min,y_max,0.02))
    

    7)数据预测

    # 第2步:预测
    Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
    
    z = Z.reshape(xx.shape)
    

    8)展示数据

    cmap_background = ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
    # 显示背景的颜色
    plt.pcolormesh(xx,yy,z,cmap=cmap_background)
    
    # 显示点的颜色
    plt.scatter(X[:,0],X[:,1],c = y,cmap=cmap_species)
    plt.xlim(xx.min(),xx.max())
    plt.ylim(yy.min(),yy.max())
    plt.title('3-class classification')
    
    plt.show()
    
    分类.png

    六.用于回归

    1)导包

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.neighbors import KNeighborsRegressor
    %matplotlib inline
    

    2)生成数据

    # 设置随机种子,确保每次运行得到相同结果
    np.random.seed(0)
    
    #生成40个随机数据,这是训练数据
    X_test = np.sort(5*np.random.rand(40,1),axis = 0)
    #这是要进行预测的数据
    T = np.linspace(0,5,100)[:,np.newaxis
    

    3)生成测试数据对应的结果

    y = np.sin(X_test).ravel()
    #添加噪声
    y[::5] += (0.5 - np.random.rand(8))
    

    4)第一步训练数据

    # 定义一个KNN回归模型
    knn = KNeighborsRegressor(n_neighbors=5)
    
    # 第一步:训练数据
    knn.fit(X,y)
    

    5)第二步预测数据

    # 第二步:预测数据
    y_ = knn.predict(T)
    

    6)绘图显示结果

    # 画图
    plt.scatter(X,y,c='k',label = 'data')
    plt.plot(T,y_,c='g',label = 'prediction')
    plt.axis('tight')
    plt.legend()
    
    #传入数据,打印预测结果
    yy = knn.predict(2)
    display(yy)
    
    回归.png

    七.预测年收入大于50K

    1)导包

    import numpy as np
    import pandas as pd
    from sklearn.neighbors import KNeighborsClassifier
    

    2)读取数据

    data = pd.read_csv('../data/adults.txt')
    data.head()
    

    3)抽取数据

    X = data[['age','education','occupation','hours_per_week']].copy()
    
    Y = data['salary'].copy()
    

    4)数据转换String-->int

    def edu2num(edu):
        return np.argwhere(X['education'].unique()==edu)[0,0]
    
    def ocp2num(ocp):
        return np.argwhere(X['occupation'].unique()==ocp)[0,0]
    

    5)map方法调用转换数据

    X['education'] = X['education'].map(edu2float)
    X['occupation'] = X['occupation'].map(ocp2float)
    

    6)切片获取训练数据和预测数据

    X_train = X.iloc[:-1000]
    X_test = X.iloc[-1000:]
    
    Y_train = Y.iloc[:-1000]
    Y_test = Y.iloc[-1000:]
    

    7)算法

    clf = KNeighborsClassifier(15)
    

    8)第一步:训练

    clf.fit(X_train,Y_train)
    

    9)第二步:预测

    Y_ = clf.predict(X_test)
    

    10)绘图显示结果

    pd.crosstab(index=Y_, columns=Y_test, rownames=['预测值',], colnames=['真实值'], margins=True)
    
    显示结果.png

    相关文章

      网友评论

        本文标题:08-KNN

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