分类与预测算法

(以下仅为本人记录,供本人查看)

感知机:

通过 w*x + b = 0 这样一条直线将二维空间划分为两个区域,落在这两个区域中的点被归为正类和负类,感知机的学习策略是通过极小化下面的损失函数来选取最终的直线:



该损失函数表达的含义是误分类点到分离平面的总距离和。也就是说,误分类点越少越好,误分类点里分离平面的总距离和越小越好。
感知机分类模型实现:
导入一个示例数据集,然后画出该数据集的图像
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 的决策规则为多数表决,即新数据属于圆圈中占比最大的一类。

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 的生成算法,它利用了基尼指数最小化的原则。

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)






  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值