参考文献:
书名:《机器学习算法的数学解析与Python实现》 作者:莫凡
出版社:机械工业出版社 出版时间:2020-01-01
(一)训练出能判断鸢尾花的模型
一、决策树训练出能判断鸢尾花的模型
Scikit-Learn库可用的决策树分类算法:
python提供的Scikit-Learn库的sklearn.tree包当中有两种解决分类问题的决策树算法DecisionTreeClassifier和ExtraTreeClassifier(用于离散化数据)、两种解决回归问题的决策树算法DecisionTreeRegressor和ExtraTreeRegressor(用于连续型数据)
调用DecisionTreeClassifier训练模型示例代码:
from sklearn.datasets import load_iris
#鸢尾花数据集
from sklearn.tree import DecisionTreeClassifier
#决策分类树
X, y=load_iris(return_X_y=TRUE)
#X为数据集,y为真实值
clf=DecisionTreeClasifier().fit(X,y)
#clf为训练好的分类模型
y_pre=clf.predict(X)
#预测值
Sco=clf.score(X,y)
#性能评估器评分,1.0为全部分类正确,0.0为全部分类错误
运行结果展示:
二、支持向量机训练出能判断鸢尾花的模型
Scikit-Learn库可用的支持向量机方法:
LinearSVC(线性函数), LinearSVR(线性函数), NuSVC(可设置支持向量数量), NuSVR(可设置支持向量数量), OneClassSVM(无监督学习的异常点检测), SVR类(可选择多种核函数), SVC类(可选择多种核函数)
调用SVC类训练模型代码示例:
from sklearn.datasets import load_iris
#从Scikit-Learn库导入支持向量机算法
from sklearn.svm import SVC
#载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
#训练模型
clf = SVC().fit(X, y)
#X为数据集,y为真实值
y_pre=clf.predict(X)
#预测值
Sco=clf.score(X,y)
#性能评估
Ker=clf.kernel
#默认为径向基rbf,可通过kernel查看
运行结果展示:
三、神经网络算法训练出能判断鸢尾花的模型
Scikit-Learn库可用的神经网络算法:
(Scikit-Learn库中multiple-layer perceptron指neural network algorithm)
MLPClassifier(用于分类问题), MLPRegressor(用于回归问题), BernoulliRBM(是基于Bernoulli Restricted Boltzmann Machine模型的神经网络分类算法)
神经网络分类算法MLPClassifier训练模型代码示例:
#从Scikit-Learn库导入鸢尾花数据集
from sklearn.datasets import load_iris
#从Scikit-Learn库导入神经网络模型中的神经网络分类算法
from sklearn.neural_network import MLPClassifier
#载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
#训练模型
clf = MLPClassifier().fit(X, y)
#使用模型进行分类预测
y_pre=clf.predict(X)
#性能评估
Sco=clf.score(X,y)
# 使用临时目录来存储图片文件
with tempfile.TemporaryDirectory() as tmpdir:
# 将预测结果y_pre和真实值y的关系图保存为PNG文件
plt.scatter(y_pre, y)
plt.xlabel('预测值')
plt.ylabel('真实值')
plt.savefig(os.path.join(tmpdir, '预测值与真实值关系图.png'))
# 将图片文件读取为二进制数据
with open(os.path.join(tmpdir, '预测值与真实值关系图.png'), 'rb') as f:
image_data = f.read()
# 将二进制数据写入新生成的文件中
with open('预测值与真实值关系图.png', 'wb') as f:
f.write(image_data)
运行结果展示:
四、集成学习方法训练出能判断鸢尾花的模型
Scikit-Learn库可用的集成学习方法:
RandomForestClassifier类(用于分类问题,以CART决策树算法作为弱学习器),RandomForestRegressor类(用于回归问题),ExtraTreeClassifier类(用于分类问题,使用极端随机树),ExtraTreeRegressor类(用于回归问题,使用极端随机树),AdaBoostClassifier类(用于分类问题),AdaBoostRegressor类(用于回归问题),GradientBoostingClassifier类(用于分类问题),GradientBoostingRegressor类(用于回归问题)
RandomForestClassifier随机森林分类算法训练模型代码示例:
import matplotlib.pyplot as plt
import numpy as np
import tempfile
import os
#若使用在线编译器,可避免交互环境出现问题
plt.switch_backend('agg')
# 从Scikit-Learn库导入鸢尾花数据集
from sklearn.datasets import load_iris
# 从Scikit-Learn库导入随机森林分类算法
from sklearn.ensemble import RandomForestClassifier
# 载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
# 训练模型
clf = RandomForestClassifier().fit(X, y)
# 使用模型进行分类预测
y_pre=clf.predict(X)
# 性能评估
Sco=clf.score(X,y)
#查看随机森林算法中以决策树作为弱学习器的详细信息
detail_decisiontree=clf.estimators_
# 使用临时目录来存储图片文件
with tempfile.TemporaryDirectory() as tmpdir:
# 将预测结果y_pre和真实值y的关系图保存为PNG文件
plt.scatter(y_pre, y)
plt.xlabel('预测值')
plt.ylabel('真实值')
# 添加直线表示它们俩的相关关系
# 首先,计算相关系数
corr = np.corrcoef(y_pre, y)[0, 1]
# 然后,计算直线的斜率和截距
slope = corr * np.std(y) / np.std(y_pre)
intercept = np.mean(y) - slope * np.mean(y_pre)
# 最后,画出直线
plt.plot([min(y_pre), max(y_pre)], [slope * min(y_pre) + intercept, slope * max(y_pre) + intercept], color='red')
plt.savefig(os.path.join(tmpdir, '预测值与真实值关系图.png'))
# 将图片文件读取为二进制数据
with open(os.path.join(tmpdir, '预测值与真实值关系图.png'), 'rb') as f:
image_data = f.read()
# 将二进制数据写入新生成的文件中
with open('预测值与真实值关系图.png', 'wb') as f:
f.write(image_data)
运行成功展示:
五、LogisticRegression训练出能判断鸢尾花的模型
LogisticRegression解决分类问题构建线性模型:
输入LogisticRegression(也叫逻辑回归、逻辑斯谛回归、对数几率回归、sigmoid函数)的样本为负,需要使得线性模型输出的预测值小于0,越小越好;输入为正,需要使得线性模型输出的预测值大于0,越大越好
Logistic回归类别:LinearRegression类(OLS),Ridge类(岭回归,L2正则项),Lasso类(L1正则项),LogisticRegression类
LogisticRegression类训练模型代码示例:
import matplotlib.pyplot as plt
import numpy as np
import tempfile
import os
# 从Scikit-Learn库导入鸢尾花数据集
from sklearn.datasets import load_iris
# 从Scikit-Learn库导入LogisticRegression算法
from sklearn.linear_model import LogisticRegression
plt.switch_backend('agg')
# 载入鸢尾花数据集
X, y = load_iris(return_X_y=True)
# 训练模型
clf = LogisticRegression().fit(X, y)
# 使用模型进行分类预测
y_pre=clf.predict(X)
# 性能评估
Sco=clf.score(X,y)
mm=0
# 使用临时目录来存储图片文件
with tempfile.TemporaryDirectory() as tmpdir:
# 将预测结果y_pre和真实值y的关系图保存为PNG文件
plt.scatter(y_pre, y)
plt.xlabel('预测值')
plt.ylabel('真实值')
# 添加直线表示它们俩的相关关系
# 首先,计算相关系数
corr = np.corrcoef(y_pre, y)[0, 1]
# 然后,计算直线的斜率和截距
slope = corr * np.std(y) / np.std(y_pre)
intercept = np.mean(y) - slope * np.mean(y_pre)
# 最后,画出直线
plt.plot([min(y_pre), max(y_pre)], [slope * min(y_pre) + intercept, slope * max(y_pre) + intercept], color='red')
plt.savefig(os.path.join(tmpdir, '预测值与真实值关系图.png'))
# 将图片文件读取为二进制数据
with open(os.path.join(tmpdir, '预测值与真实值关系图.png'), 'rb') as f:
image_data = f.read()
# 将二进制数据写入新生成的文件中
with open('预测值与真实值关系图.png', 'wb') as f:
f.write(image_data)
运行结果展示:
(二)K-means聚类训练模型
K-means聚类原理:
step one: K个质心(初始的K个质心是随机选取的,非第一次循环的K个质心是由上一次循环产生的)-->将其他数据点(样本点当中除开与质心取值相同的点)归为与其距离最近的质点所在的簇,聚成K个簇
step two: 在K个簇中,以各个簇内所有样本点的维度值均值作为各个簇的新质心,得到K个质心
step three: 循环step one和step two,循环停止条件为“K个质心不再变化”
K-means聚类训练无监督模型代码:
#导入绘图库
import matplotlib.pyplot as plt
#从Scikit-Learn库导入聚类模型中的K-means聚类算法,属于无监督学习
from sklearn.cluster import KMeans
#导入聚类数据生成工具
from sklearn.datasets import make_blobs
#用sklearn自带的make_blobs方法生成聚类测试数据
n_samples = 1500
#该聚类数据集共1500个样本
X, y = make_blobs(n_samples=n_samples)
#进行聚类,这里n_clusters设定为3,也即聚成3个簇
y_pred=KMeans(n_clusters=3).fit_predict(X)
#用点状图显示聚类效果
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()
############或者生成一张图
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import numpy as np
import tempfile
import os
# 从Scikit-Learn库导入聚类模型中的K-means聚类算法,属于无监督学习
from sklearn.cluster import KMeans
# 导入聚类数据生成工具
from sklearn.datasets import make_blobs
# 用sklearn自带的make_blobs方法生成聚类测试数据
n_samples = 1500
# 该聚类数据集共1500个样本
X, y = make_blobs(n_samples=n_samples)
# 进行聚类,这里n_clusters聚成3个簇
y_pred = KMeans(n_clusters=3).fit_predict(X)
# 使用临时目录来存储图片文件
with tempfile.TemporaryDirectory() as tmpdir:
# 将聚类效果图保存为PNG文件
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.savefig(os.path.join(tmpdir, '聚类效果图.png'))
# 将图片文件读取为二进制数据
with open(os.path.join(tmpdir, '聚类效果图.png'), 'rb') as f:
image_data = f.read()
# 将二进制数据写入新生成的文件中
with open('聚类效果图_文件.png', 'wb') as f:
f.write(image_data)
运行结果展示:
综合效果,n_clusters=3时聚类效果最好
n_clusters=3:
n_clusters=6
n_clusters=9: