机器学习实战——多模型实现预测功能
前言
大家好✨,这里是bio🦖。
机器学习方法已经应用到日常生活的方方面面。从自动推荐看什么电影、点什么食物、买什么商品,到个性化的在线电台和从照片中识别好友,许多现代化网站和设备的核心都是机器学习算法。
所以这次给大家带来的是机械学习模型的应用,也可以说是实战。如果你是新手这篇文展的代码将有助于你理解机械学习的应用。观看完本文(主要是代码),你将学习到:
1. 如何构建简单机械学习模型 KNN, Random Forest, Decision Tree and Multilayer Perceptron
2. 如何提高模型的表现
3. 如何对数据进行处理以及可视化展现
一、数据准备
1.1 数据下载
数据来自csdn神州数码集团2022年校园技术大赛,提取码:jc58。数据集包括train数据、test数据以及参考的预测结果格式。train数据包含User ID Gender Age AnnualSalary Purchased,简单来说就是一个二分类的问题,根据用户的性别、年龄、年收入判断用户是否购买车辆🚗。

1.2 数据格式转换
使用pandas读入训练数据,其展示如图二。其中Gender列包括女性和男性,可以将其从字符转换为数字0和1。
import pandas as pd
train_test_data = pd.read_csv('train.csv')
display(train_test_data)

使用如下代码将male和female转换为0和1。
trans_form = train_test_data['Gender']
trans_form = [1 if i == "Male" else 0 for i in trans_form]
train_test_data["Gender"] = trans_form
display(train_test_data)

1.3 数据拆分
将训练数据拆按照3:1分成训练集和测试集,
from sklearn.model_selection import train_test_split
import numpy as np
# train and test data
X_train, X_test, y_train, y_test = np.array(train_test_split(train_test_data[["Gender","Age","AnnualSalary"]], train_test_data["Purchased"], random_state=0))


二、模型构建
2.1 K近邻
k近邻(K-Nearest Neighbors)算法,也称为KNN或k-NN,是一种非参数的监督学习分类算法,它使用邻近性对单个数据点的分组进行分类或预测。从图五可以看出邻居数小于等于三的情况下,出现了过拟合,随着邻居数目增多,模型越复杂。最好的情况应当是邻居数为9时。
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
train_accuracy = []
test_accuracy = []
neighbors = range(1,11)
for neighbor in neighbors:
knn = KNeighborsClassifier(n_neighbors=neighbor)
knn.fit(X_train,y_train)
knn.score(X_test,y_test)
train_accuracy.append(knn.score(X_train, y_train))
test_accuracy.append(knn.score(X_test,y_test))
plt.plot(neighbors, train_accuracy, label='train accuracy')
plt.plot(neighbors, test_accuracy, label='test accuracy')
for i,j in zip(neighbors, train_accuracy):
plt.text(i,j,round(j,2))
for i,j in zip(neighbors, test_accuracy):
plt.text(i,j,round(j,2))
plt.xlabel("Neighbor")
plt.ylabel("Accuracy")
plt.legend()

2.2 决策树与随机森林
决策树(Decision tree)由一个决策图和可能的结果(包括资源成本和风险)组成, 用来创建到达目标的规划。决策树建立并用来辅助决策,是一种特殊的树结构。决策树是一个利用像树一样的图形或决策模型的决策支持工具,包括随机事件结果,资源代价和实用性。
随着深度的增加,决策树出现了过拟合的情况,最好的情况是深度为4时。该模型在该数据下优于KNN。
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
train_accuracy = []
test_accuracy = []
depth = range(1,11)
for num in depth:
tree = DecisionTreeClassifier(max_depth=num, random_state=0)
tree.fit(X_train,y_train)
train_accuracy.append(tree.score(X_train, y_train))
test_accuracy.append(tree.score(X_test,y_test))
plt.plot(depth, train_accuracy, label="train accuracy")
plt.plot(depth, test_accuracy, label='test accuracy')
for i,j in zip(depth, train_accuracy):
plt.text(i,j,round(j,2))
for i,j in zip(depth, test_accuracy):
plt.text(i,j,round(j,2))
plt.xlabel("Depth")
plt.ylabel("Accuracy")
plt.legend()

随机森林本质上是许多决策树的集合,其中每棵树都和其他树略有不同。随机森林背后的思想是,每棵树的预测可能都相对较好,但可能对部分数据过拟合。如果构造很多树,并且每棵树的预测都很好,但都以不同的方式过拟合,那么我们可以对这些树的结果取平均值来降低过拟合。既能减少过拟合又能保持树的预测能力。
可以看出随机森林在训练集拟合的非常好,但是在测试集表现较差,都存在过拟合,不过没有正则化可以选择,不然应该能减少部分过拟合。
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
train_accuracy = []
test_accuracy =[]
forests = range(1,11)
for num in forests:
forest = RandomForestClassifier(n_estimators=num, random_state=0)
forest.fit(X_train, y_train)
train_accuracy.append(forest.score(X_train, y_train))
test_accuracy.append(forest.score(X_test, y_test))
plt.plot(forests, train_accuracy, label="train accuracy")
plt.plot(forests, test_accuracy, label="test accuracy")
for i,j in zip(forests, train_accuracy):
plt.text(i,j,round(j,2))
for i,j in zip(forests, test_accuracy):
plt.text(i,j,round(j,2))
plt.xlabel("Tree num")
plt.ylabel("Accuracy")

2.3 多层感知器
多层感知机(multilayer perceptron, MLP),它可以作为研究更复杂的深度学习方法的起点。MLP 可以被视为广义的线性模型,执行多层处理后得到结论。
首先构造一个简单的MLP,观察。在训练集和测试集的准确率都不是很高,只有百分之六十多。
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(solver='lbfgs', random_state=0, hidden_layer_sizes=[10,10]).fit(X_train, y_train)
print(mlp.score(X_train, y_train))
print(mlp.score(X_test, y_test))
0.6044444444444445
0.6266666666666667
对数据进行缩放,即使用无监督学习的方法,这里先使用MinMax进行处理,x-min/max-min,这样所有数据就都在零与一之间。这样处理后模型表现显著上升。
# data scale (unsupervised learning)
from sklearn.preprocessing import MinMaxScaler
# x-min/max-min
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
from sklearn.neural_network import MLPClassifier
mlp = MLPClassifier(solver='lbfgs',hidden_layer_sizes=[200,200,200],random_state=0, alpha=1).fit(X_train_scaled, y_train)
print(mlp.score(X_train_scaled, y_train))
print(mlp.score(X_test_scaled, y_test))
0.914074074074074
0.9022222222222223