(以下仅为本人记录,供本人查看)
感知机:
通过 w*x + b = 0 这样一条直线将二维空间划分为两个区域,落在这两个区域中的点被归为正类和负类,感知机的学习策略是通过极小化下面的损失函数来选取最终的直线:
该损失函数表达的含义是误分类点到分离平面的总距离和。也就是说,误分类点越少越好,误分类点里分离平面的总距离和越小越好。
感知机分类模型实现:
导入一个示例数据集,然后画出该数据集的图像
支持向量机(SVM)
感知机分类模型实现:
导入一个示例数据集,然后画出该数据集的图像
from matplotlib import pyplot as plt
import pandas as pd
# 读取数据
data = pd.read_csv("two_class_data.csv", header=0)
# 读取数据列
x = data['x']
y = data['y']
c = data['class']
# 绘制散点图,c 参数用于分类着色
plt.scatter(x, y, c=c)
plt.show()
from matplotlib import pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Perceptron
# 导入数据
data = pd.read_csv("two_class_data.csv", header=0)
# 定义特征变量和目标变量
feature = data[['x', 'y']].values
target = data['class'].values
# 对数据集进行切分,70% 为训练集,30% 为测试集。
x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.3, random_state=50)
# 构建模型
model = Perceptron()
# 训练模型
model.fit(x_train, y_train)
# 预测
results = model.predict(x_test)
# 以默认样式绘制训练数据
plt.scatter(x_train[:, 0], x_train[:, 1], alpha=0.3)
# 以方块样式绘制测试数据
plt.scatter(x_test[:, 0], x_test[:, 1], marker=',', c=y_test)
# 将预测结果用标签样式标注在测试数据左上方
for i, txt in enumerate(results):
plt.annotate(txt, (x_test[:, 0][i], x_test[:, 1][i]))
plt.show()
train_test_split
train_test_split参数解释
:
train_data:被划分的样本特征集
train_target:被划分的样本标签
test_size:如果是浮点数,在0-1之间,表示样本占比;如果是整数的话就是样本的数量
random_state:是随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。
随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。
plt.scatter(x_train[:, 0], x_train[:, 1], alpha=0.3)分别以0列和1列为X轴和Y轴进行映射支持向量机(SVM)
SVM通过寻找距离两种类别间隔最大的平面 w*x-b=0 来作为分割平面。其中,实线与两条虚线的距离相等,且最大。落在两条虚线上的白点或黑点被我们称之为「支持向量」,这也就是支持向量机的名字来源。
支持向量机通过引入核函数来解决非线性分类的问题
支持向量机通过核技巧将其映射到三维空间中(第二张),然后通过绿色的平面完成分类。最终再投影到二维空间中,平面投影下来就变成了一条曲线。
在将特征映射到高维空间的过程中,常常会用到多种核函数,包括:线性核函数、多项式核函数、高斯径向基核函数等。其中,最常用的就算是高斯径向基核函数了,也简称为 RBF 核。
SVM非线性分类实现:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.decomposition import PCA
# 导入数据
data = pd.read_csv('zoo.csv', header=0)
# 定义特征变量和目标变量
feature = data.iloc[:, 1:17].values
target = data['type'].values
# 对数据集进行切分,70% 为训练集,30% 为测试集。
x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.3, random_state=50)
# 构建模型
model = SVC()
# 训练模型
model.fit(x_train, y_train)
# 预测
results = model.predict(x_test)
print(model.score(x_test, y_test))
使用PCA降维方法缩减特征数量,方便进行可视化:
from matplotlib import pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.decomposition import PCA
# 导入数据
data = pd.read_csv('zoo.csv', header=0)
# 定义特征变量和目标变量
feature = data.iloc[:, 1:17].values
target = data['type'].values
# 使用 PCA 降维至 2
pca = PCA(n_components=2)
feature_pca = pca.fit_transform(feature)
# 对数据集进行切分,70% 为训练集,30% 为测试集。
x_train, x_test, y_train, y_test = train_test_split(feature_pca, target, test_size=0.3, random_state=50)
# 构建模型
model = SVC()
# 训练模型
model.fit(x_train, y_train)
# 预测
results = model.predict(x_test)
print(model.score(x_test, y_test))
# 以默认样式绘制训练数据
plt.scatter(x_train[:, 0], x_train[:, 1], alpha=0.3)
# 以方块样式绘制测试数据
plt.scatter(x_test[:, 0], x_test[:, 1], marker=',', c=y_test)
# 将预测结果用标签样式标注在测试数据左上方
for i, txt in enumerate(results):
plt.annotate(txt, (x_test[:, 0][i], x_test[:, 1][i]))
plt.show()
K-近邻法(KNN)
KNN 的方法是以该数据为圆心,画一个圆。圆的半径不确定,可大可小。当它为图示中的内圆时,B 类数据多余 A 类,所以五角星数据属于 B 类。当为大圆时,A 类数据多于 B 类,所以五角星属于 A 类。而圆的大小,取决于 K 值。而 K 指的是与新数据最近邻的 K 个值。
KNN中的三个关键要素:
1. K 值的大小。K 值一般通过测试数据交叉验证来选择。
2. 距离的度量。新数据与最近邻数据之间的距离计算方式,有欧式距离或者曼哈顿距离等。
3. 分类决策规则。KNN 的决策规则为多数表决,即新数据属于圆圈中占比最大的一类。
决策树与随机森林:
KNN中的三个关键要素:
1. K 值的大小。K 值一般通过测试数据交叉验证来选择。
2. 距离的度量。新数据与最近邻数据之间的距离计算方式,有欧式距离或者曼哈顿距离等。
3. 分类决策规则。KNN 的决策规则为多数表决,即新数据属于圆圈中占比最大的一类。
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
# 导入数据
data = pd.read_csv('three_class_data.csv', header=0)
# 定义特征变量和目标变量
feature = data[['x', 'y']].values
target = data['class'].values
# 对数据集进行切分,70% 为训练集,30% 为测试集。
x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.3, random_state=50)
# 构建模型
model = KNeighborsClassifier()
# 训练模型
model.fit(x_train, y_train)
# 预测
results = model.predict(x_test)
print(model.score(x_test, y_test))
# 绘制决策边界等高线图
cm0 = plt.cm.Oranges
cm1 = plt.cm.Greens
cm2 = plt.cm.Reds
cm_color = ListedColormap(['red', 'yellow'])
x_min, x_max = data['x'].min() - .5, data['x'].max() + .5
y_min, y_max = data['y'].min() - .5, data['y'].max() + .5
xx, yy = np.meshgrid(np.arange(x_min, x_max, .1),
np.arange(y_min, y_max, .1))
Z0 = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 0]
Z1 = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
Z2 = model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 2]
Z0 = Z0.reshape(xx.shape)
Z1 = Z1.reshape(xx.shape)
Z2 = Z2.reshape(xx.shape)
plt.contourf(xx, yy, Z0, cmap=cm0, alpha=.9)
plt.contourf(xx, yy, Z1, cmap=cm1, alpha=.5)
plt.contourf(xx, yy, Z2, cmap=cm2, alpha=.4)
# 绘制训练集和测试集
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=cm_color)
plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test, cmap=cm_color, edgecolors='black')
plt.show()
决策树与随机森林:
执行决策树算法,一般分为三步:
1. 特征选项。
特性选择及选择判断规则。判断西瓜好坏的决策树中,特征为触感、敲声。特征选择是决策树建立前完成的工作,它决定了决策树的最终形状。一般情况下,我们依据3种指标来选择特征,分别是信息增益、信息增益比、以及基尼指数。
其中,依据信息增益来选择特征,是一种来源于信息论和概率统计中的方法。我们通过判断某一特征对决策树前后影响的信息差值,从而选出最关键的特征。这种依据信息增益来选择特征的算法,也被称作 ID3 算法。
后来,我们发现信息增益在划分训练数据特征时,容易偏向取值较多的特征。于是,我们改进了 ID3 算法,通过信息增益比值来选择,发展出了 C4.5 算法。除此之外,还有一种叫 CART 的生成算法,它利用了基尼指数最小化的原则。
1. 特征选项。
特性选择及选择判断规则。判断西瓜好坏的决策树中,特征为触感、敲声。特征选择是决策树建立前完成的工作,它决定了决策树的最终形状。一般情况下,我们依据3种指标来选择特征,分别是信息增益、信息增益比、以及基尼指数。
其中,依据信息增益来选择特征,是一种来源于信息论和概率统计中的方法。我们通过判断某一特征对决策树前后影响的信息差值,从而选出最关键的特征。这种依据信息增益来选择特征的算法,也被称作 ID3 算法。
后来,我们发现信息增益在划分训练数据特征时,容易偏向取值较多的特征。于是,我们改进了 ID3 算法,通过信息增益比值来选择,发展出了 C4.5 算法。除此之外,还有一种叫 CART 的生成算法,它利用了基尼指数最小化的原则。
2. 树的生成。
选择完特征之后,我们就通过这些特征来生成一颗完整的决策树。生成的原则是,所有训练数据都能分配到相应的叶节点。
选择完特征之后,我们就通过这些特征来生成一颗完整的决策树。生成的原则是,所有训练数据都能分配到相应的叶节点。
3. 树的剪枝。
一颗完整的决策树,使得训练数据得到有效的划分。但是,你会发现完整的决策树往往对于测试数据的效果并不好。这就出现了过度拟合的问题。过度拟合,指模型对训练数据的效果很好,但是对测试数据的效果差,泛化能力较弱。
解决决策树过度拟合的方法是对决策树进行剪枝。剪枝,也就是去掉一些叶节点。剪枝并不是随意乱剪,它的依据是,剪枝前和剪枝后的决策树整体损失函数最小。
随机森林与决策树不同的地方在用,它不只是建立一颗树,而是建立一堆树。与决策树不同,随机森林每次只从全部数据集中随机抽取一部分数据用于生成树。另外,随机森林在生成树的时候不会剪枝。
随机森林的优点多多,例如:它可以处理大量的数据;它可以在特征不均衡时,依然维持较高的准确度;随机森林学习速度快,一般情况下,结果比单纯应用决策树要好。
分别使用随机森林和决策树算法针对iris 数据集进行分类:
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
# 导入数据
iris = load_iris()
x_train = iris.data[:120]
x_test = iris.data[120:]
y_train = iris.target[:120]
y_test = iris.target[120:]
# 建立模型
model_tree = DecisionTreeClassifier(random_state=10)
model_random = RandomForestClassifier(random_state=10)
# 训练模型并验证
model_tree.fit(x_train, y_train)
s1 = model_tree.score(x_test, y_test)
model_random.fit(x_train, y_train)
s2 = model_random.score(x_test, y_test)
print('DecisionTree:', s1)
print('RandomForest:', s2)