SVM模型
支持向量机(Support Vector Machine, SVM)是一类按监督学习方式对数据进行*二元分类*的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) [1-3] 。
SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别问题中有得到应用。
线性可分模型
非线性可分模型 --- 核函数 -- 拓展到高维去解决
· 线性核函数
· 多项式核函数
· 高斯核函数
· sigmoid核函数
经验之谈 大多数情况下,选择高斯核函数是一种相对偷懒而又有效的方法,因为高斯核是一种指数函数,它的泰勒展开式可以是无穷维的,即相当于把原始样本点映射到高维空间中
# 非线性比线性可分准确率更高
具体公式推导参考:https://zhuanlan.zhihu.com/p/52168498
代码操作
LinearSVC(tol=0.0001, C=1.0, multi_class='ovr', fit_intercept=True, intercept_scaling=1,
class_weight=None, max_iter=1000)
tol:⽤用于指定SVM模型迭代的收敛条件,默认为0.0001
C:⽤用于指定⽬目标函数中松弛因⼦子的惩罚系数值,默认为1
fit_intercept:bool类型参数,是否拟合线性“超平⾯面”的截距项,默认为True
intercept_scaling:当参数fit_intercept为True时,该参数有效,通过给参数传递⼀一个浮点值,就相
当于在⾃自变量量X矩阵中添加⼀一常数列列,默认该参数值为1
class_weight:⽤用于指定因变量量类别的权重,如果为字典,则通过字典的形式{
class_label:weight}
传递每个类别的权重;如果为字符串串'balanced',则每个分类的权重与实际样本中的⽐比例例成反⽐比,当
各分类存在严重不不平衡时,设置为'balanced'会⽐比较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最⼤大迭代次数,默认为1000
SVC(C=1.0, kernel=‘rbf’, degree=3, gamma=‘auto’, coef0=0.0, tol=0.001,
class_weight=None, verbose=False, max_iter=-1, random_state=None)
C:⽤用于指定⽬目标函数中松弛因⼦子的惩罚系数值,默认为1
kernel:⽤用于指定SVM模型的核函数,该参数如果为'linear',就表示线性核函数;如果为'poly',就
表示多项式核函数,核函数中的r和p值分别使⽤用degree参数和gamma参数指定;如果为'rbf',表示
径向基核函数,核函数中的r参数值仍然通过gamma参数指定;如果为'sigmoid',表示Sigmoid核函
数,核函数中的r参数值需要通过gamma参数指定;如果为'precomputed',表示计算⼀一个核矩阵
degree:⽤用于指定多项式核函数中的p参数值
gamma:⽤用于指定多项式核函数或径向基核函数或Sigmoid核函数中的r参数值
coef0:⽤用于指定多项式核函数或Sigmoid核函数中的r参数值
tol:⽤用于指定SVM模型迭代的收敛条件,默认为0.001
class_weight:⽤用于指定因变量量类别的权重,如果为字典,则通过字典的形式{
class_label:weight}
传递每个类别的权重;如果为字符串串'balanced',则每个分类的权重与实际样本中的⽐比例例成反⽐比,当
各分类存在严重不不平衡时,设置为'balanced'会⽐比较好;如果为None,则表示每个分类的权重相等
max_iter:指定模型求解过程中的最⼤大迭代次数,默认为-1,表示不不限制迭代次数
手写体字母识别
用最佳参数做预测
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
data=pd.read_csv(r'C:\Users\Administrator\Desktop\letterdata.csv')
predictors=data.columns[1:]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.letter,
test_size=0.25,random_state=1234)
C=[0.05,0.1,0.5,1,2,5]
parameters={
'C':C}
grid_linear_svc=model_selection.GridSearchCV(estimator=svm.LinearSVC(),
param_grid=parameters,
scoring='accuracy',cv=5,verbose=1)
grid_linear_svc.fit(x_train,y_train)
print(grid_linear_svc.best_params_,grid_linear_svc.best_score_)
pred_linear_svc=grid_linear_svc.predict(x_test)
print(metrics.accuracy_score(y_test,pred_linear_svc))
out:
0.71479
--------------------------------------------------------------------------------------------------------
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
data=pd.read_csv(r'C:\Users\Administrator\Desktop\letterdata.csv')
predictors=data.columns[1:]
x_train,x_test,y_train,y_test=model_selection.train_test_split(data[predictors],data.letter,
test_size=0.25,random_state=1234)
C=[0.1,0.5,1,2,5]
kernel=['rbf','linear','poly','sigmoid']
parameters={
'kernel':kernel,'C':C}
grid_svc=model_selection.GridSearchCV(estimator=svm.SVC(),
param_grid=parameters,
scoring='accuracy',cv=5,verbose=1)
grid_svc.fit(x_train,y_train)
print(grid_svc.best_params_,grid_svc.best_score_)
pred_svc=grid_svc.predict(x_test)
print(metrics.accuracy_score(y_test,pred_svc))
out:
0.9596
使用默认参数做预测
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
letters = pd.read_csv(r'letterdata.csv')
letters.head()
letters.shape
*** (20000,17) ***
predictors = letters.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(letters[predictors], letters.letter,
test_size = 0.25, random_state = 1234)
linear_svc = svm.LinearSVC()
linear_svc.fit(X_train,y_train)
***LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)***
pred_linear_svc = linear_svc.predict(X_test)
metrics.accuracy_score(y_test, pred_linear_svc)
*** 0.5672 ***
*** 准确率太低 不选择线性可分SVM模型 ***
nolinear_svc = svm.SVC(kernel='rbf')
nolinear_svc.fit(X_train,y_train)
pred_svc = nolinear_svc.predict(X_test)
metrics.accuracy_score(y_test,pred_svc)
*** 0.9734
选择非线性SVM模型预测手写体字母准确率是非常高的
***
森林火灾可能性预测
forestfires = pd.read_csv(r'forestfires.csv')
forestfires.head()
forestfires.drop('day',axis = 1, inplace = True)
forestfires.month = pd.factorize(forestfires.month)[0]
forestfires.head()
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import norm
sns.distplot(forestfires.area, bins = 50, kde = True, fit = norm, hist_kws = {
'color':'steelblue'},
kde_kws = {
'color':'red', 'label':'Kernel Density'},
fit_kws = {
'color':'black','label':'Nomal', 'linestyle':'--'})
plt.legend()
plt.show()
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/809e1918b8eb9155e68abfa9926035c6.png)
from sklearn import preprocessing
import numpy as np
from sklearn import neighbors
y = np.log1p(forestfires.area)
predictors = forestfires.columns[:-1]
X = preprocessing.scale(forestfires[predictors])
X_train,X_test,y_train,y_test = model_selection.train_test_split(X, y, test_size = 0.25, random_state = 1234)
svr = svm.SVR()
svr.fit(X_train,y_train)
pred_svr = svr.predict(X_test)
metrics.mean_squared_error(y_test,pred_svr)
*** 1.9268192310372876 ***
*** 选择非线性可分模型 ***
epsilon = np.arange(0.1,1.5,0.2)
C= np.arange(100,1000,200)
gamma = np.arange(0.001,0.01,0.002)
parameters = {
'epsilon':epsilon,'C':C,'gamma':gamma}
grid_svr = model_selection.GridSearchCV(estimator = svm.SVR(max_iter=10000),param_grid =parameters,
scoring='neg_mean_squared_error',cv=5,verbose =1, n_jobs=2)
grid_svr.fit(X_train,y_train)
print(grid_svr.best_params_, grid_svr.best_score_)
***
{
'C': 300, 'epsilon': 1.1000000000000003, 'gamma': 0.001} -1.9946668196316621
***
pred_grid_svr = grid_svr.predict(X_test)
metrics.mean_squared_error(y_test,pred_grid_svr)
*** 1.7455012238826595 ***
*** 数据越小越好 模型预测成功率越高 ***
Kmeans-K均值聚类模型
一、从数据中随机挑选k个样本点作为原始的簇中⼼心
二、计算剩余样本与簇中⼼心的距离,并把各样本标记为离k个簇中⼼心最近的类别
三、重新计算各簇中样本点的均值,并以均值作为新的k个簇中⼼心
四、不不断重复第⼆步和第三步,直到簇中⼼心的变化趋于稳定,形成最终的k个簇
有监督机器学习算法
含有因变量y
无监督机器学习算法
不含因变量y
1 优点
容易理解,聚类效果不错,虽然是局部最优, 但往往局部最优就够了;
处理大数据集的时候,该算法可以保证较好的伸缩性;
当簇近似高斯分布的时候,效果非常不错;
算法复杂度低。
2 缺点
K 值需要人为设定,不同 K 值得到的结果不一样;
对初始的簇中心敏感,不同选取方式会得到不同结果;
对异常值敏感;
样本只能归为一类,不适合多分类任务;
不适合太离散的分类、样本类别不平衡的分类、非凸形状的分类。(球形最佳)
针对K值的选择
1.拐点法
图形可视化
2.轮廓系数法
数学公式计算
随机一个三组二元正态分布随机数
import pandas as pd
import numpy as np
import matplotlib.pyplot as<