【机器学习基础】【每天进步一点点】机器学习基础——基于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) # 绘图
结果为:
满分,不过还是数据集太简单了。
代码和数据集在附件,下载解压后,上传.ipynb和.csv到NoteBook,运行.ipynb即可。
- 点赞
- 收藏
- 关注作者
评论(0)