10.18学习笔记 - SVM&集成学习
10.18复习了决策树实现过程和思想原理,学习了支持向量机和集成学习部分思想
一、复习决策树
- 必须掌握
- 分类树:
- 评判法则(分割依据)
- entropy 信息熵
- gini 基尼系数
- 输出:
- vote 思想(投票机制)
- 评判法则(分割依据)
- 回归树
- 评判法则(分割依据)
- mse 均方误差
- var 方差
- 输出:
- mean 均值思想
- 评判法则(分割依据)
- 分类树:
二、支持向量机
支持向量机由于其本身的性质在深度学习年代已经被淘汰,所以仅浅学其思想和代码实现作为了解
1.关于支持向量机
- 小数据、少特征时代的王者
- 有着高计算代价和高理论难度(凸优化)
- 有着相对较高的预测精度
from sklearn.svm import SVC
from sklearn.svm import SVR
from sklearn.datasets import load_iris
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import numpy as np
"""
分类问题
"""
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=1)
svc = SVC()
svc.fit(X=X_train,y=y_train)
svc.predict(X=X_test)
# output:array([0, 1, 1, 0, 2, 1, 2, 0, 0, 2, 1, 0, 2, 1, 1, 0, 1, 1, 0, 0, 1, 1,
2])
svc.score(X=X_test,y=y_test)
# output:0.9565217391304348
三、 模型汇总
- 分类模型:
- KNN,贝叶斯,决策树,支持向量机
- 回归模型:
- KNN,决策树,支持向量机
- 聚类模型:
- KMeans
所有的算法都是野蛮计算
- Q:为什么有这么多模型
- A:每一种算法都是基于不同的假设,以及不同的理论出发点建立的,使用的前提条件就是根据他的假设相吻合的,工作中全试一遍
四、框架&编程语言
框架相对于编程语言就是将常见的算法封装到了一起,解决了重复劳动的问题,方便快速查找
- Q:是否不适用于出现交集的类别
- A:会的,自然场景肯定会出现,可以使用软间隔,允许中间一部分出错,交集可以映射到其他维度,通过核函数计算(核技巧)
核函数:将低维空间数据映射到高维空间以求解
1.不同算法比较
# 这里是人为制造了一些假数据方便测试
from sklearn.datasets import make_classification
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import time
import numpy as np
"""
生成数据(八分类问题)
- make_classification()
n_informative 有用的特征
n_redundant 没用的特征
n_classes 类别
"""
X, y = make_classification(n_samples=10000, n_features=20, n_informative=5, n_classes=8, random_state=1)
"""
测试样本概率
"""
n_samples = [np.sum(y == i) for i in set(y)]
p = n_samples / np.sum(n_samples)
print(p)
# op:[0.1249 0.1243 0.1247 0.1264 0.1246 0.1243 0.126 0.1248]
"""
数据分割
"""
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
(a)KNN分类测试
'''
KNN 分类测试
'''
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5)
start_train = time.time()
knn.fit(X=X_train, y=y_train)
stop_train = time.time()
# 模型预测
score = knn.score(X=X_test, y=y_test)
stop_eval = time.time()
print(f'KNN 模型:准确率:{score} 训练耗时:{stop_train - start_train}秒; 推理耗时{stop_eval - stop_train}')
KNN 模型:准确率:0.5565 训练耗时:0.0019998550415039062秒; 推理耗时0.3070235252380371
- Q:模型准确率为0.55说明模型很差吗?
- A:不,再次强调,数据本身没有可比性,八分类问题中概率为0.125,KNN实际已经将准确率提高到了4.5倍左右
(b)高斯贝叶斯
'''
高斯贝叶斯 分类测试
'''
from sklearn.naive_bayes import GaussianNB
# from sklearn.decomposition import PCA
# pca = PCA(n_components=5)
# pca.fit(X=X_train)
# X_train = pca.transform(X_train)
# X_test = pca.transform(X_test)
NB = GaussianNB()
start_train = time.time()
NB.fit(X=X_train, y=y_train)
stop_train = time.time()
# 模型预测
score = NB.score(X=X_test, y=y_test)
stop_eval = time.time()
print(f' NB模型:准确率:{score} 训练耗时:{stop_train - start_train}秒; 推理耗时{stop_eval - stop_train}')
NB 模型:准确率:0.418 训练耗时:0.0030438899993896484秒; 推理耗时0.00099945068359375
- Q:通过PCA降维后,剩下相对重要的特征,再用贝叶斯是否能提高准确率?
- A:不一定,但是可以减少计算代价
(c)决策树
'''
决策树 分类测试
'''
from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier()
start_train = time.time()
dtc.fit(X=X_train, y=y_train)
stop_train = time.time()
# 模型预测
score = dtc.score(X=X_test, y=y_test)
stop_eval = time.time()
print(f'决策树 模型:准确率:{score} 训练耗时:{stop_train - start_train}秒; 推理耗时{stop_eval - stop_train}')
决策树 模型:准确率:0.562 训练耗时:0.16399717330932617秒; 推理耗时0.0009996891021728516
(d)支持向量机
'''
支持向量机 分类测试
'''
from sklearn.svm import SVC
svc = SVC()
start_train = time.time()
svc.fit(X=X_train, y=y_train)
stop_train = time.time()
# 模型预测
score = svc.score(X=X_test, y=y_test)
stop_eval = time.time()
print(f'支持向量机 模型:准确率:{score} 训练耗时:{stop_train - start_train}秒; 推理耗时{stop_eval - stop_train}')
支持向量机 模型:准确率:0.6435 训练耗时:2.346158742904663秒; 推理耗时1.1651272773742676
- 这里其实就能看出来SVM的计算代价比其他模型高出好几个数量级的时间
(e)随机森林
'''
随机森林 分类测试
'''
# ensemble 指的是集成学习,一群臭皮匠,抵个诸葛亮
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()
start_train = time.time()
rfc.fit(X=X_train, y=y_train)
stop_train = time.time()
# 模型预测
score = rfc.score(X=X_test, y=y_test)
stop_eval = time.time()
print(f'随机森林 模型:准确率:{score} 训练耗时:{stop_train - start_train}秒; 推理耗时{stop_eval - stop_train}')
随机森林 模型:准确率:0.6815 训练耗时:2.246029853820801秒; 推理耗时0.0409998893737793
五、集成学习 - Ensemble
- 集成学习中没有新的算法,继承学习是一种算法调度策略
- 目标:一堆弱分类器的组合打败强分类器(一堆臭皮匠,干掉诸葛亮)
- 强分类器:KNN,贝叶斯,决策树,SVM …
- 弱分类器:将强分类器的复杂度降低,精度降低,提高速度,变成一个弱分类器
- 决策树是一种在集成学习中常用的弱分类器
1.集成学习的调度思想
# Voting
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import VotingRegressor
# stack
from sklearn.ensemble import StackingClassifier
from sklearn.ensemble import StackingRegressor
# bag
from sklearn.ensemble import BaggingClassifier
from sklearn.ensemble import BaggingRegressor
# boost
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import AdaBoostRegressor
- voting思想:算法不同,数据相同,试图产生略有差异的结果,再基于规则整合结果
- bagging思想:算法相同,数据不同,试图产生略有差异的结果,再基于规则整合结果
- stacking思想:前面类似于voting,但是,结果拟合时使用模型,而不是使用人为规则,2阶段的思想
- boosting思想:错题本思想!!!也是多阶段思想(MTCNN)