【机器学习基础】【每天进步一点点】机器学习基础——基于SVM的红酒处理

举报
Tianyi_Li 发表于 2020/05/26 21:02:54 2020/05/26
【摘要】 机器学习基础——基于SVM的红酒处理,轻松了解SVM,基于常见的红酒数据集,从基础开始,学习SVM,每天进步一点点哈。

先来分析数据集:

葡萄酒识别数据集共有178行,14列,第一列为类别标签,用1,2,3表示三种不同类别,其中第1行至第59行为第一类,类别标签为‘1’,第60行至第130行为第二类,标签为‘2’,第131行至第178行为第三类,标签为‘3’,第2列至第14列为13个成分的含量信息,其基本信息如图所示,该信息来自the UC Irvine Machine Learning Repository。

其中13个成分分别为

1) 酒精(Alcohol),

2) 苹果酸(Malic acid),Float类型

3) 灰分,这里指葡萄酒中的固体物质(Ash),Float类型

4) 灰分的碱性,这里指葡萄酒中的固体物质的碱性(Alcalinity of ash),Float类型 

5) 镁(Magnesium),Int类型

6) 苯酚总量(Total phenols),Float类型

7) 黄酮类物质(Flavanoids),Float类型

8) 非黄酮类酚(Nonflavanoid phenols),Float类型

9) 原花青素(Proanthocyanins),Float类型

10) 颜色深浅(Color intensity),Float类型

11)色度(Hue),Float类型

12)稀释的酒的蛋白质浓度的光谱度量(OD280/OD315 of diluted wines),Float类型

13)脯氨酸(Proline),Int类型


下面直接来实战吧,直接在代码中理解:

# -*- coding:utf-8 -*-
# Created on 2020/5/26
# Revised: 2020/5/26
# @author: Tianyi_Li
# Method: SVM


import os
import numpy as np
import pandas as pd
from sklearn import svm
from urllib import request
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn import preprocessing
from sklearn.externals import joblib
from sklearn.metrics import roc_curve
from sklearn.metrics import hinge_loss
from sklearn.model_selection import train_test_split
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA


# ************************************************** SVM ***********************************************
# 通过查阅资料发现,wine数据集来自著名的加州大学欧文机器学习库,一个著名的公开数据库。可以直接使老师所给
# 的数据集,也可以从网站下载数据,这里定义了函数downloadData,loadDataSet用来处理网上下载数据
# 数据下载
def downloadData():
    if (not(os.path.exists('wine.data'))):
        print('Downloading with urllib\n')
        url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
        request.urlretrieve(url, './wine.data')
    else:
        print('Wine.data exists!\n')


# 数据加载
def loadDataSet(fileName):
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split(',')
        fltLine = list(map(float, curLine[1:]))  # 将字符list转换为float list
        dataMat.append(fltLine)
        labelLine = int(curLine[0])
        labelMat.append(labelLine)
    return np.array(dataMat), np.array(labelMat)    # 返回numpy数组


def MySVM(csv_file):

    # 获取数据集方法一:从网上直接下载数据集使用
    # downloadData()  # 下载数据
    # dataMat, labelMat = loadDataSet('wine.data')
    # dataMat = visualData(dataMat, labelMat)

    # 获取数据集方法二:直接使用老师所给数据集
    csv_data = np.loadtxt(csv_file, delimiter=',')
    dataMat = np.float64(csv_data[:, 1:14])  # 13个特征数据,在第1列到第14列,但是这里要用[1:14],而且不能用[1:-1],否则最后一列丢失
    labelMat = np.float64(csv_data[:, 0])

    # 交叉验证数据集划分
    '''
    train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集
    标签。
    格式:X_train, X_test, y_train, y_test = train_test_split(train_data,train_target,
    test_size=0.3, random_state=0)
    参数解释:
    train_data:被划分的样本特征集
    train_target:被划分的样本标签
    test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量
    random_state:是随机数的种子。
    随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
    随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
         种子不同,产生不同的随机数;
         种子相同,即使实例不同也产生相同的随机数。
    '''
    # 直接进行SVM的正确率对应关系:
    # test_size:   0.6                   0.5                    0.4                   0.3
    # Accuracy:    0.9345794392523364    0.9438202247191011     0.9583333333333334    0.9629629629629629
    # test_size    0.2                   0.1
    # Accuracy     0.9444444444444444    0.9444444444444444

    # LDA 降维
    lda = LDA(n_components=2)
    dataMat_LDA = lda.fit(dataMat, labelMat).transform(dataMat)  # 有监督在程序中表现在用到了标签y。

    # 随机抽取训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(dataMat_LDA, labelMat, test_size=0.1, random_state=1)

    # SVM生成和训练
    '''
    sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False,
    tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape=None,
    random_state=None)说明
    参数:
    l. C:C-SVC的惩罚参数C,默认值是1.0
    C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练
    集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
    2. kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 
        0– 线性:u'v
        1– 多项式:(gamma*u'*v + coef0)^degree
        2– RBF函数:exp(-gamma|u-v|^2)
        3–sigmoid:tanh(gamma*u'*v +coef0)
    3. degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
    4. gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
    5. coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
    6. probability :是否采用概率估计.默认为False
    7. hrinking :是否采用shrinking heuristic方法,默认为true
    8. tol :停止训练的误差值大小,默认为1e-3
    9. cache_size :核函数cache缓存大小,默认为200
    10. class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
    11. verbose :允许冗余输出?
    12. max_iter :最大迭代次数。-1为无限制。
    13. decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
    14. random_state :数据洗牌时的种子值,int值

    Reference: 
    https://www.cnblogs.com/crawer-1/p/8870700.html
    https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
    '''

    clf = svm.SVC(kernel='rbf', C=1, degree=3, probability=True, gamma='auto')
    clf.fit(x_train, y_train)   # 用训练数据拟合分类器模型

    # 返回SVM结果预测的标签,即属于哪类
    result_label = clf.predict(x_test)
    print('result_label', result_label)

    # 返回预测属于某标签的概率
    Myproba = clf.predict_proba(x_test)
    print('probability:', Myproba)

    # 损失下降曲线
    # fpr, tpr, thresholds = roc_curve(y_test, Myproba[:, 1], pos_label=1)
    # print('thresholds:', thresholds)
    # plt.plot(fpr, tpr)
    # plt.title('ROC curve of SVM')
    # plt.show()

    # SVM正确率验证
    clf.score(x_test, y_test)
    print('Accuracy:', clf.score(x_test, y_test))
    # 原始数据 1 -- 1-59    2 -- 60-130     3 -- 131-178
    return result_label, y_test


def SVM_plot(result_label, y_test):
    # 绘图
    plt.figure
    SampleNumber = len(result_label)
    x_SampleNumber = np.linspace(1, SampleNumber, SampleNumber)
    y_SampleNumber = y_test
    plt.scatter(x_SampleNumber, y_SampleNumber, c='red', label='test data')
    plt.scatter(x_SampleNumber, result_label, c='green', label='pridected data')
    plt.title(' SVM ')  # 绘制title
    plt.show()

# ************************************************** SVM 结束 *********************************************


if __name__ == '__main__':
    # SVM
    result_label, y_test = MySVM(csv_file="wine.csv")  # 1 - 59,2 - 71 ,3 - 47
    SVM_plot(result_label, y_test)  # 绘图


结果为:

image.png


满分,不过还是数据集太简单了。


代码和数据集在附件,下载解压后,上传.ipynb和.csv到NoteBook,运行.ipynb即可。



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。