机器学习之鸢尾花-支持向量机
“支持向量机”(SVM)是一种有监督的机器学习算法,可用于分类任务或回归任务。但是,它主要适用于分类问题。在这个算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是你拥有的是特征的数量),每个特征的值是特定坐标的值。然后,我们通过找到很好地区分这两个类的超平面来执行分类的任务。
分隔超平面:将数据集分割开来的直线叫做分隔超平面。
超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。
间隔:一个点到分割面的距离,称为点相对于分割面的距离。
数据集中所有的点到分割面的小间隔的2倍,称为分类器或数据集的间隔。
大间隔:SVM分类器是要找大的数据集间隔。
支持向量:坐落在数据边际的两边超平面上的点被称为支持向量。
支持向量机的优势在于:
在高位空间中非常有效
即使在数据维度比样本数量大的情况下仍然有效
在决策函数中使用训练集的子集,因此他也是高效利用内存
通用性:不同的核函数与特定的决策函数--赌赢。常见的kernel已经提供可以指定定制的内核。
支持向量机的缺点:
如果特征你数量比样本数量大的多,在选择核函数的时候要避免过拟合,正则化项是非常重要的
支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的
如下:
# “支持向量机”(SVM)是一种有监督的机器学习算法,可用于分类任务或回归任务。但是,它主要适用于分类问题。
# 在这个算法中,我们将每个数据项绘制为n维空间中的一个点(其中n是你拥有的是特征的数量),每个特征的值是特定坐标的值。
# 然后,我们通过找到很好地区分这两个类的超平面来执行分类的任务。
# 分隔超平面:将数据集分割开来的直线叫做分隔超平面。
# 超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。
# 间隔:一个点到分割面的距离,称为点相对于分割面的距离。
# 数据集中所有的点到分割面的小间隔的2倍,称为分类器或数据集的间隔。
# 大间隔:SVM分类器是要找大的数据集间隔。
# 支持向量:坐落在数据边际的两边超平面上的点被称为支持向量。
#
# 支持向量机的优势在于:
# 在高位空间中非常有效
# 即使在数据维度比样本数量大的情况下仍然有效
# 在决策函数中使用训练集的子集,因此他也是高效利用内存
# 通用性:不同的核函数与特定的决策函数--赌赢。常见的kernel已经提供可以指定定制的内核。
# 支持向量机的缺点:
# 如果特征你数量比样本数量大的多,在选择核函数的时候要避免过拟合,正则化项是非常重要的
# 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的
# sklearn.svc的主要参数
# C: float参数 默认值为1.0
# 错误项的惩罚系数。C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。
# 相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
# kernel: str参数 默认为'rbf'
# 算法中采用的核函数类型,可选参数有:
# 'linear':线性核函数
# 'poly':多项式核函数
# 'rbf':径像核函数/高斯核
# 'sigmod':sigmod核函数
# 'precomputed':核矩阵
# gamma: float参数 默认为auto
# 核函数系数,只对‘rbf’,‘poly’,‘sigmod’有效。
# coef0: float参数 默认为0.0
# 核函数中的独立项,只有对‘poly’和‘sigmod’核函数有用,是指其中的参数c
# probability:bool参数 默认为False
# 是否启用概率估计。 这必须在调用fit()之前启用,并且会fit()方法速度变慢。
# shrinking:bool参数 默认为True
# 是否采用启发式收缩方式
# tol: float参数 默认为1e^-3
# svm停止训练的误差精度
# cache_size:float参数 默认为200
# 指定训练所需要的内存,以MB为单位,默认为200MB。
# class_weight: 字典类型或者‘balance’字符串。默认为None
# 给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C.
# 如果给定参数‘balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
# verbose :bool参数 默认为False
# 是否启用详细输出。 此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。
# 一般情况都设为False,不用管它。
# max_iter :int参数 默认为-1
# 大迭代次数,如果为-1,表示不限制
# random_state:int型参数 默认为None
# 伪随机数发生器的种子,在混洗数据时用于概率估计。
# decision_function_shape : ‘ovo’, ‘ovr’
# default=’ovr’ 实现多分类的实现方式
from sklearn import svm
def test_svm(X_train, X_test, y_train, y_test,X,y):
Cs = np.logspace(-2, 4, num=100)
scores_train = []
scores_test = []
for C in Cs:
model = svm.SVC(C=C,gamma=0.1)
model.fit(X_train, y_train)
scores_train.append(accuracy_score(model.predict(X_train), y_train))
scores_test.append(accuracy_score(model.predict(X_test), y_test))
# 绘图
print('训练得分={}'.format(scores_train))
print('测试得分={}'.format(scores_test))
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot()
ax.plot(Cs, scores_train, label='scores train')
ax.plot(Cs, scores_test, label='scores test')
ax.set_xlabel(r"C")
ax.set_ylabel(r"score")
ax.set_xscale('log')
ax.set_title("SVM")
ax.legend()
plt.show()
tuned_parameters = [{'kernel': ['linear', 'rbf','poly','sigmod'],
'decision_function_shape':['ovo','ovr'],
'C': [0.01, 0.1, 1, 10, 100, 1000]}]
svc = svm.SVC(gamma=0.1)
model = GridSearchCV(svc, param_grid=tuned_parameters, n_jobs=-1, verbose=2, scoring='accuracy')
model.fit(X_train, y_train)
print('网格搜索-度量记录:', model.cv_results_) # 包含每次训练的相关信息
print('网格搜索-佳度量值:', model.best_score_) # 获取佳度量值
# 网格搜索-佳度量值: 0.980952380952381
print('网格搜索-佳参数:', model.best_params_) # 获取佳度量值时的代定参数的值。是一个字典
# 网格搜索-佳参数: {'C': 10, 'decision_function_shape': 'ovo', 'kernel': 'rbf'}
print('网格搜索-佳模型:', model.best_estimator_) # 获取佳度量时的分类器模型
# 网格搜索-佳模型:SVC(C=10, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
# decision_function_shape='ovo', degree=3, gamma=0.1, kernel='rbf',
# max_iter=-1, probability=False, random_state=None, shrinking=True,
# tol=0.001, verbose=False)
svc = svm.SVC(C=10, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovo', degree=3, gamma=0.1, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
svc.fit(X_train,y_train)
print("Residual sum of squares:%.4f" % np.mean((model.predict(X_test) - y_test) ** 2))
# Residual sum of squares:0.0222
print('Score: %.4f' % model.score(X_test, y_test))
# Score: 0.9778
#考虑到绘图只能是2维的,所以根据调整相关特征值,使用佳参数重新训练和绘图
X, y, X_train, y_train, X_test, y_test=X[:,:2], y,X_train[:,:2],y_train,X_test[:,:2],y_test
svc = svm.SVC(C=10, break_ties=False, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovo', degree=3, gamma=0.1, kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
svc.fit(X_train, y_train)
print('Score: %.4f' % svc.score(X_test, y_test)) #Score: 0.8000
plt.figure(figsize=(10, 6))
draw_model(svc, X, y,X_train,y_train,X_test,y_test, h=0.01,title='SVC report')
plt.show()
names = ['SVC Linear Kernel',
'SVC Polynomial Kernel with Degree=3',
'SVC Gaussian Kernel with $\gamma=0.5$',
'LinearSVC ']
classifiers = [
svm.SVC(C=10, kernel='linear'),
svm.SVC(C=10, kernel='poly', gamma=0.5, degree=3),
svm.SVC(C=10, kernel='rbf', gamma=0.5),
svm.LinearSVC(C=10, multi_class='ovr',max_iter=1000000)
]
i=1
plt.figure(figsize=(10, 6))
for name, clf in zip(names, classifiers):
clf.fit(X_train, y_train)
print('训练得分={}'.format(accuracy_score(clf.predict(X_train), y_train)))
print('测试得分={}'.format(accuracy_score(clf.predict(X_test), y_test)))
plt.subplot(2, 2, i)
i=i+1
draw_model(clf, X, y, X_train, y_train, X_test, y_test, h=0.01, title=name)
plt.show()
if __name__=='__main__':
X_train,X_test,y_train,y_test,X,y=load_data(iris)
# -----------------------逻辑回归--------------------------------
# test_LogisticRegression(X_train,X_test,y_train,y_test)
# test_LogisticRegression_C(X_train, X_test, y_train, y_test)
# test_LogisticRegression_Cpenaltyssolvers(X_train, X_test, y_train, y_test)
# test_LogisticRegression_Cmulti_classsolvers(X_train, X_test, y_train, y_test)
# test_LogisticRegression_penaltyssolvers(X_train, X_test, y_train, y_test)
# test_LogisticRegression_multi_classssolvers(X_train, X_test, y_train, y_test)
# test_LogisticRegression_best(X_train, X_test, y_train, y_test)
# ---------------------K近邻算法-----------------------
#test_KNeighborsClassifier(X_train, X_test, y_train, y_test, X, y)
# ------------------朴素贝叶斯-----------------------
# 高斯朴素贝叶斯
# 多项分布朴素贝叶斯
# 伯努利朴素贝叶斯
# test_naive_bayes(X_train, X_test, y_train, y_test, X, y)
# ---------------------决策树-----------------------
# test_tree(X_train, X_test, y_train, y_test, X, y)
# -------------------SVM支撑向量机-----------------------
test_svm(X_train, X_test, y_train, y_test, X, y)
# -------------------降维-----------------------
# ---------------------K Means聚类-----------------------
# ------------------高斯混合模型聚类-----------------------
相关文章