zoukankan      html  css  js  c++  java
  • Python | 使用SVM支持向量机进行鸢尾花分类

    运行环境

    Python: 3.7.1
    库: sklearn (Python的机器学习工具箱)
    

    目的:

    根据鸢尾花的四个特征,对三种鸢尾花进行分类

    数据(共150行,这里截取前6行,完整数据以及代码的下载链接见文末):

    方法:调用内部SVM库进行鸢尾花分类

    特征1 特征2 特征3 特征4 鸢尾花类型
    5.1 3.5 1.4 0.2 Iris-setosa
    4.9 3 1.4 0.2 Iris-setosa
    4.7 3.2 1.3 0.2 Iris-setosa
    4.6 3.1 1.5 0.2 Iris-setosa
    5 3.6 1.4 0.2 Iris-setosa
    5.4 3.9 1.7 0.4 Iris-setosa

    代码如下:

    from sklearn.model_selection import train_test_split
    from sklearn import svm
    
    data_Set = []
    data_Set_x = []
    data_Set_y = []
    
    #打开数据集,字符串前加r表示raw string,防止路径字符串中存在的反斜杠带来的转义
    data_file = open(r"D:\\Coding\\Py\\Machine-Learning\\SVM_OLD\\Data_SVM.csv")
    
    #拆分数据集,取前四列为x,第五列为y
    for line in data_file.readlines():
        lineArr = line.strip().split(',')
        data_Set.append(lineArr)
        data_Set_x.append(lineArr[0:4])
        data_Set_y.append(lineArr[4])
    
    #按照7:3的比例分割训练集和测试集
    data_train_x, data_test_x = train_test_split(data_Set_x,
                                                 test_size=0.3,
                                                 random_state=55)
    data_train_y, data_test_y = train_test_split(data_Set_y,
                                                 test_size=0.3,
                                                 random_state=55)
    """
    分别利用四种核函数进行训练,这些核函数都可以设置参数,例如
    decision_function_shape='ovr'时,为one v rest,即一个类别与其他类别进行划分,
    decision_function_shape='ovo'时,为one v one,即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
    不设置的话会使用默认参数设置
    """
    #使用linear线性核函数,C越大分类效果越好,但是可能过拟合
    clf1 = svm.SVC(C=1, kernel='linear',
                   decision_function_shape='ovr').fit(data_train_x, data_train_y)
    #使用rbf径向基核函数,gamma值越小,分类界面越连续;gamma值越大,分类界面越“散”,分类效果越好,但有可能会过拟合。
    clf2 = svm.SVC(C=1, kernel='rbf', gamma=1).fit(data_train_x, data_train_y)
    #使用poly多项式核函数
    clf3 = svm.SVC(kernel='poly').fit(data_train_x, data_train_y)
    #使用sigmoid神经元激活核函数
    clf4 = svm.SVC(kernel='sigmoid').fit(data_train_x, data_train_y)
    
    #打印使用不同核函数进行分类时,训练集和测试集分类的准确率
    print("linear线性核函数-训练集:", clf1.score(data_train_x, data_train_y))
    print("linear线性核函数-测试集:", clf1.score(data_test_x, data_test_y))
    print("rbf径向基核函数-训练集:", clf2.score(data_train_x, data_train_y))
    print("rbf径向基函数-测试集:", clf2.score(data_test_x, data_test_y))
    print("poly多项式核函数-训练集:", clf3.score(data_train_x, data_train_y))
    print("poly多项式核函数-测试集:", clf3.score(data_test_x, data_test_y))
    print("sigmoid神经元激活核函数-训练集:", clf4.score(data_train_x, data_train_y))
    print("sigmoid神经元激活核函数-测试集:", clf4.score(data_test_x, data_test_y))
    
    # 使用decision_function()可以查看决策函数
    print(clf1.decision_function(data_train_x))
    # 使用predict()可以查看预测结果
    print(clf1.predict(data_train_x))
    

    运行结果:

    1. 分类准确率
    linear线性核函数-训练集: 1.0
    linear线性核函数-测试集: 0.9555555555555556
    rbf径向基核函数-训练集: 0.9904761904761905
    rbf径向基函数-测试集: 0.9555555555555556
    poly多项式核函数-训练集: 1.0
    poly多项式核函数-测试集: 0.9333333333333333
    sigmoid神经元激活核函数-训练集: 0.34285714285714286
    sigmoid神经元激活核函数-测试集: 0.3111111111111111
    
    1. 决策函数(仅截取部分,每一列的值代表到各类别的举例)
    [[-0.18006398  1.06550708  2.1145569 ]
     [-0.2266221   1.07558987  2.15103223]
     [-0.16806693  1.08720057  2.08086637]
     [ 2.07795355  1.29285195 -0.3708055 ]
     [-0.18840558  1.05553666  2.13286892]
     [-0.20384     1.10258546  2.10125453]
    
    1. 分类结果(仅截取部分)
    ['Iris-virginica' 'Iris-virginica' 'Iris-virginica' 'Iris-setosa'
     'Iris-virginica' 'Iris-virginica' 'Iris-setosa' 'Iris-versicolor'
     'Iris-virginica' 'Iris-versicolor' 'Iris-setosa' 'Iris-setosa'
    

    代码以及数据集下载:

    链接:https://pan.baidu.com/s/1iZo472Ynvav0mQK3VvpJFQ
    提取码:ovri

    参考文章:


    Tips:时间会解决一切
  • 相关阅读:
    打印九九乘法表
    PAT (Basic Level) Practice (中文) 1091 N-自守数 (15分)
    PAT (Basic Level) Practice (中文)1090 危险品装箱 (25分) (单身狗进阶版 使用map+ vector+数组标记)
    PAT (Basic Level) Practice (中文) 1088 三人行 (20分)
    PAT (Basic Level) Practice (中文) 1087 有多少不同的值 (20分)
    PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)
    PAT (Basic Level) Practice (中文) 1085 PAT单位排行 (25分) (map搜索+set排序+并列进行排行)
    PAT (Basic Level) Practice (中文) 1083 是否存在相等的差 (20分)
    PAT (Basic Level) Practice (中文) 1082 射击比赛 (20分)
    PAT (Basic Level) Practice (中文) 1081 检查密码 (15分)
  • 原文地址:https://www.cnblogs.com/RioTian/p/15521370.html
Copyright © 2011-2022 走看看