数据分析中的常用数学模型实战教程笔记(下)

SVM模型

支持向量机(Support Vector Machine, SVM)是一类按监督学习方式对数据进行*二元分类*的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane) [1-3]  。
SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别问题中有得到应用。

线性可分模型

非线性可分模型 --- 核函数 -- 拓展到高维去解决
	· 线性核函数
	· 多项式核函数
	· 高斯核函数
	· sigmoid核函数
	经验之谈 大多数情况下,选择高斯核函数是一种相对偷懒而又有效的方法,因为高斯核是一种指数函数,它的泰勒展开式可以是无穷维的,即相当于把原始样本点映射到高维空间中
	
# 非线性比线性可分准确率更高

具体公式推导参考:https://zhuanlan.zhihu.com/p/52168498

代码操作

# 线性可分SVM模型
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

# 非线性可分SVM模型
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)
#网格搜索法,寻找线性可分SVM的最佳惩罚系数C
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)
#网格搜索法,寻找线性可分SVM的最佳惩罚系数C和核函数
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')
# 数据前5行
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)

# 选择线性可分SVM模型
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模型 ***
# 选择非线性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')
# 数据前5行
forestfires.head()

# 观察多个列字段 数据处理
# 删除day变量
forestfires.drop('day',axis = 1, inplace = True)
# 将月份作数值化处理
forestfires.month = pd.factorize(forestfires.month)[0]
# 预览数据前5行
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()

在这里插入图片描述

# 导入第三方模块
from sklearn import preprocessing
import numpy as np
from sklearn import neighbors
# 对area变量作对数变换
y = np.log1p(forestfires.area)
# 将X变量作标准化处理
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)

# 构建默认参数的SVM回归模型
svr = svm.SVR()
# 模型在训练数据集上的拟合
svr.fit(X_train,y_train)
# 模型在测试上的预测
pred_svr = svr.predict(X_test)
# 计算模型的MSE
metrics.mean_squared_error(y_test,pred_svr)

*** 1.9268192310372876 ***

*** 选择非线性可分模型 ***
# 使用网格搜索法,选择SVM回归中的最佳C值、epsilon值和gamma值
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)
# 计算模型在测试集上的MSE值
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<
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值