美文网首页
02 使用 scikit-learn 的 kNN 分类算法实现鸢

02 使用 scikit-learn 的 kNN 分类算法实现鸢

作者: 夏威夷的芒果 | 来源:发表于2018-08-19 22:02 被阅读86次

    代码

    # 数据源下载地址:https://video.mugglecode.com/data_ai.zip,下载压缩包后解压即可
    # -*- coding: utf-8 -*-
    
    """
        任务:鸢尾花识别
    """
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.neighbors import KNeighborsClassifier   #这个函数可以自动训练哦
    
    DATA_FILE = './data_ai/Iris.csv'
    
    SPECIES_LABEL_DICT = {
        'Iris-setosa':      0,  # 山鸢尾
        'Iris-versicolor':  1,  # 变色鸢尾
        'Iris-virginica':   2   # 维吉尼亚鸢尾
    }
    
    # 使用的特征列
    FEAT_COLS = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
    
    
    def main():
        """
            主函数
        """
        # 读取数据集
        iris_data = pd.read_csv(DATA_FILE, index_col='Id')
        iris_data['Label'] = iris_data['Species'].map(SPECIES_LABEL_DICT)  #用这个把花名映射成数字,才方便拟合
    
        # 获取数据集特征
        X = iris_data[FEAT_COLS].values    #这个X是array类型的, .values会转成arrary
    
        # 获取数据标签
        y = iris_data['Label'].values     # .values会转成arrary
    
        # 划分数据集:X训,X测,y训,y测  = train_test_split(X, y),return的类型是按照输入的类型来的
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)
    
        # 声明模型
        knn_model = KNeighborsClassifier()
        # 训练模型
        knn_model.fit(X_train, y_train)
        # 评价模型
        accuracy = knn_model.score(X_test, y_test)
        print('预测准确率:{:.2f}%'.format(accuracy * 100))
    
        # 取单个测试样本
        idx = 25
        test_sample_feat = [X_test[idx, :]]  #因为X是array 类型的所以才能切片
        y_true = y_test[idx]
        y_pred = knn_model.predict(test_sample_feat)  #这里面装的是单元素列表[],里面套的是array()
        print('真实标签{},预测标签{}'.format(y_true, y_pred))
    
    
    if __name__ == '__main__':
        main()
    

    运行结果

    预测准确率:96.00%
    真实标签0,预测标签[0]
    

    需要注意的地方

    • 读取的数据集如果y标签是数字,需要做映射:
    SPECIES_LABEL_DICT = {
        'Iris-setosa':      0,  # 山鸢尾
        'Iris-versicolor':  1,  # 变色鸢尾
        'Iris-virginica':   2   # 维吉尼亚鸢尾
    }
    iris_data['Label'] = iris_data['Species'].map(SPECIES_LABEL_DICT)  
    #用这个把花名映射成数字,才方便拟合
    
    • 划分数据集:X训,X测,y训,y测 = train_test_split(X, y),return的类型是按照输入的类型来的
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=10)
    
    • 声明训练与评价:
    from sklearn.neighbors import KNeighborsClassifier   #这个函数可以自动训练哦
    # 声明模型
    knn_model = KNeighborsClassifier()
    # 训练模型
    knn_model.fit(X_train, y_train)
    # 评价模型
    accuracy = knn_model.score(X_test, y_test)
    print('预测准确率:{:.2f}%'.format(accuracy * 100))
    
    • 取单个测试样本
    # 取单个测试样本
    idx = 25
    test_sample_feat = [X_test[idx, :]]  #因为X是array 类型的所以才能切片
    y_true = y_test[idx]
    y_pred = knn_model.predict(test_sample_feat)#这里面装的是单元素列表[],里面套的是array()
    print('真实标签{},预测标签{}'.format(y_true, y_pred))
    

    练习:使用 scikit-learn 的 kNN 分类算法实现水果识别器

    • 题目描述:使用k近邻距离算法创建一个水果识别器,根据水果的属性,判断该水果的种类。

    • 题目要求:

    • 使用scikit-learn的kNN算法进行识别

    • 数据文件:
    • 数据源下载地址:https://video.mugglecode.com/fruit_data.csv(数据源与上节课相同)

    • fruit_data.csv,包含了59个水果的的数据样本。

    • 共5列数据
      fruit_name:水果类别
      mass: 水果质量
      width: 水果的宽度
      height: 水果的高度
      color_score: 水果的颜色数值,范围0-1。
      0.85 - 1.00:红色
      0.75 - 0.85: 橙色
      0.65 - 0.75: 黄色
      0.45 - 0.65: 绿色


      image
    • 问题拆解提示:

    1. 如何处理样本的字符串标签?
    2. 如何建立kNN模型?
    3. 如何训练模型?
    4. 如何验证模型?
    • 问题解决提示:
    1. 利用Pandas模块中的map()方法进行字符串到数字的映射转换;
    2. 利用scikit-learn模块中的KNeighborsClassifier()建立kNN模型;
    3. 利用scikit-learn模块中的fit()方法训练模型;
    4. 利用scikit-learn模块中的score()方法验证模型。

    参考代码

    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.neighbors import KNeighborsClassifier
    
    
    #特征文字
    
    feat_cols =['mass','width','height','color_score']
    
    #读取数据
    
    data = pd.read_csv('/Users/miraco/PycharmProjects/ai/data_ai/fruit_data.csv')
    
    #预处理
    
    fruit2num = {'apple'    :  0 ,
                 'mandarin' :  1 ,
                 'orange'   :  2 ,
                 'lemon'    :  3
                 }
    data['label'] = data['fruit_name'].map(fruit2num)
    #取出X和y
    
    X = data[feat_cols].values
    y = data['label'].values
    
    #划分数据
    
    X_train_set, X_test_set ,y_train_set, y_test_set = train_test_split(X,y, random_state = 20, test_size= 1/5)
    
    print('原始数据集共{}个样本,其中训练集样本数为{},测试集样本数为{}'.format(
        X.shape[0], X_train_set.shape[0], X_test_set.shape[0]))
    
    #训练
    
    knn_model = KNeighborsClassifier()
    
    knn_model.fit(X_train_set, y_train_set)
    
    #准确率检测
    
    accur = knn_model.score(X_test_set,y_test_set)
    
    print(f'正确率为{accur*100}%')
    
    #试试看
    
    num2fruit = dict(zip(fruit2num.values(),fruit2num.keys()))
    
    for idx in range(X_test_set.shape[0]):
        test_feat = [X_test_set[idx]]
        y_pridict = num2fruit.get(int(knn_model.predict(test_feat)))
        y_real = num2fruit.get(y_test_set[idx])
        YorN = '对' if y_pridict == y_real else '错'
        print(f'第{idx+1}个测试水果的结果是{y_pridict},本来应该是{y_real},所以测{YorN}了')
    
    
    
    

    运行结果

    原始数据集共59个样本,其中训练集样本数为47,测试集样本数为12
    正确率为83.33333333333334%
    第1个测试水果的结果是mandarin,本来应该是mandarin,所以测对了
    第2个测试水果的结果是apple,本来应该是apple,所以测对了
    第3个测试水果的结果是apple,本来应该是apple,所以测对了
    第4个测试水果的结果是lemon,本来应该是lemon,所以测对了
    第5个测试水果的结果是apple,本来应该是orange,所以测错了
    第6个测试水果的结果是apple,本来应该是apple,所以测对了
    第7个测试水果的结果是lemon,本来应该是lemon,所以测对了
    第8个测试水果的结果是mandarin,本来应该是mandarin,所以测对了
    第9个测试水果的结果是orange,本来应该是orange,所以测对了
    第10个测试水果的结果是orange,本来应该是orange,所以测对了
    第11个测试水果的结果是orange,本来应该是lemon,所以测错了
    第12个测试水果的结果是apple,本来应该是apple,所以测对了
    
    

    注意

    在这里字典的映射的选择不同,会造成结果的差异。示例中给出了另一代码, 它的‘水果-数字’映射和我不一样, 拟合的结果也就不一样了。

    # -*- coding: utf-8 -*-
    
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.neighbors import KNeighborsClassifier
    
    CATEGRORY_LABEL_DICT = {
        'apple':    0,
        'lemon':    1,
        'mandarin': 2,
        'orange':   3
    }
    
    # 使用的特征列
    FEAT_COLS = ['mass', 'width', 'height', 'color_score']
    
    
    def main():
        """
            主函数
        """
        fruit_data = pd.read_csv('/Users/miraco/PycharmProjects/ai/data_ai/fruit_data.csv')
    
        # 1. 处理样本的字符串标签,添加label一列作为预测标签
        fruit_data['label'] = fruit_data['fruit_name'].map(CATEGRORY_LABEL_DICT)
    
        # 4列水果的属性作为样本特征
        X = fruit_data[FEAT_COLS].values
        # label列为样本标签
        y = fruit_data['label'].values
    
        # 划分数据集
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/5, random_state=20)
    
        print('原始数据集共{}个样本,其中训练集样本数为{},测试集样本数为{}'.format(
            X.shape[0], X_train.shape[0], X_test.shape[0]))
    
        # 2. 建立kNN模型
        knn_model = KNeighborsClassifier()
        # 3. 训练模型
        knn_model.fit(X_train, y_train)
    
        # 4. 验证模型
        accuracy = knn_model.score(X_test, y_test)
        print('预测准确率为:{:.2f}%'.format(accuracy * 100))
    
    
    if __name__ == '__main__':
        main()
    

    相关文章

      网友评论

          本文标题:02 使用 scikit-learn 的 kNN 分类算法实现鸢

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