今天继续是SVM,救命啊我什么时候才能提起精神推一遍算法。。
Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。
数据集包含150个数据集,分为三类,每类50个数据,每个数据包含4个属性。
可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花属于三个种类中的哪一类。
【分两类】
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
%matplotlib inline
#查看数据
def create_data():
iris=load_iris()
df=pd.DataFrame(iris.data,columns=iris.feature_names)
df['label']=iris.target
df.columns=['sepal length','sepal width','petal length','petal width','label']
df['label']=df['label'].map({0:-1,1:1})
data=np.array(df.iloc[:100,[0,1,-1]])
return data[:,:2],data[:,-1]
x,y=create_data()
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
#绘图查看分布
plt.scatter(x[:50,0],x[:50,1],label='0')
plt.scatter(x[50:,0],x[50:,1],label='1')
plt.legend()
#sklearn.svm.SVC
from sklearn.svm import SVC
clf=SVC()
clf.fit(x_train,y_train)
#准确率检测
clf.score(x_test,y_test)#1.0
#混淆矩阵
pre=clf.predict(x_test)
from sklearn.metrics import confusion_matrix
cm=confusion_matrix(y_test,pre)
cm#array([[11, 0],[ 0, 14]]
【分三类】
import numpy as np
from sklearn import model_selection
from sklearn import svm
import matplotlib.pyplot as plt
from matplotlib import colors
import matplotlib as mpl
#查看数据
def create_data():
iris=load_iris()
df=pd.DataFrame(iris.data,columns=iris.feature_names)
df['label']=iris.target
df.columns=['sepal length','sepal width','petal length','petal width','label']
data=np.array(df.iloc[:,:])
return data[:,:4],data[:,-1]
x,y=create_data()
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.30)
#用decision_function_shape来设定是一对多还是一对一
clf = svm.SVC(C=0.5, kernel='linear', decision_function_shape='ovr')
#训练
clf.fit(x_train, y_train, sample_weight=None)
#预测准确率
acc =clf.score(x_test,y_test)
print('Accuracy:%f' %acc)
#绘图,选取前两列features
x1 = x[:, :2]
x_train, x_test, y_train, y_test = train_test_split(x1, y,random_state=1, test_size=0.3)
clf.fit(x_train, y_train, sample_weight=None)#sample_weight平衡样本权重
x1_min, x1_max = x1[:, 0].min(), x1[:, 0].max()
x2_min, x2_max = x1[:, 1].min(), x1[:, 1].max()
#200j,200个点,即步长
x1, x2 = np.mgrid[x1_min:x1_max:200j, x2_min:x2_max:200j]
g_test = np.stack((x1.flat, x2.flat), axis=1)
print(g_test)
g_map = clf.predict(g_test).reshape(x1.shape)
y = clf.predict(x_test)
cm_light = colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
cm_dack = colors.ListedColormap(['r', 'g', 'b'])
plt.pcolormesh(x1, x2, g_map, cmap=cm_light)
plt.scatter(x_test[:, 0], x_test[:, 1],c=np.squeeze(y.flat), s=50, cmap=cm_dack)
plt.plot()
plt.grid()
plt.show()
--------【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)
【参数】
C:C-SVC的惩罚参数C?默认值是1.0
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
– 线性:u’v
– 多项式:(gammau’v + coef0)^degree
– RBF函数:exp(-gamma|u-v|^2)
– sigmoid:tanh(gammau’v + coef0)
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
probability :是否采用概率估计?.默认为False
shrinking :是否采用shrinking heuristic方法,默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)
verbose :允许冗余输出?
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
random_state :数据洗牌时的种子值,int值
主要调节的参数有:C、kernel、degree、gamma、coef0。
【思考】
(1)参考的原文首先手撕了算法,有空一定要看
(2)之前计算准确率都用混淆矩阵,以及accuracy_score(prediction,test_y),
这里用的是clf.score(x_test,y_test),即不需要提前算出prediction,直接输入test的x和y即可。
至此掌握了三种准确率计算方法:
①混淆矩阵
from sklearn.metrics import confusion_matrix
accuracy=confusion_matrix(y_test,pre)
②计算prediction后比较
prediction=model.predict(test_x)
accuracy=accuracy_score(prediction,test_y)
③直接输入test数据
accuracy=model.score(x_test,y_test)
(3)可以用散点图查看数据分布,但本文只考虑了前两个features,高维度features画图可能需要PCA降维,下一个项目可以尝试。
(4)多类分类的算法选择,decision_function_shape=‘ovr’,这里ovr指一对多。
①ovr(one vs rest):一类对k-1类,可能导致的问题是–训练样本不平衡,若-1样本数多,支持向量机会倾向样本数多的类别。
②ovo(one vs one):一类对另一类,投票的方式获得最终结果,可能的问题是–需要k(k-1)/2个支持向量机,耗时长。
③常常综合两种算法。