目录
一、机器学习建模的步骤
实际业务中的机器学习建模,通常考虑以下一个环节:
- 问题的抽象与理解
- 数据的准备和预处理
- 各种机器学习算法的检讨
- 不同算法结果的分析与对比
- 模型的选择与调优
二、鸢尾花的分类问题
鸢尾花的分类是机器学习领域的经典案例,主要是依据鸢尾花的花萼和花瓣等属性特征,对鸢尾花进行分类。数据在python中有对应的库可以直接调用,而且数据集是结构化的表格数据,不需要做过多的事前处理。
这是典型的机器学习中的分类问题,考虑K近邻,朴素贝叶斯,逻辑回归,SVC,决策树,随机森林,前馈神经网络(多层感知机),可以将数据划分为训练集和测试集,根据各算法在测试集上的结果表现,进行对比,最终选出性能相对优良的算法进行建模和调优。
三、基于鸢尾花分类的建模
1. 环境准备
本次建模过程调用的核心库只有一个 scikit-learn
scikit-learn包含常用的机器学习算法,以及数据的预处理,特征工程和模型评价等多种方法。
可以根据需要安装或升级
pip install scikit-learn # 安装
pip install --upgrade scikit-learn # 升级
2. 数据集
本次调用scikit-learn内置的iris数据集,包含鸢尾花的三个分类
Iris Setosa
Iris Versicolor
Iris Virginica
四个属性
Sepal length:萼片长度
Sepal width:萼片宽度
Petal length:花瓣长度
Petal width:花瓣宽度
3. 选用的算法
K近邻
朴素贝叶斯
逻辑回归
SVC
决策树
随机森林
前馈神经网络(多层感知机)
4. 数据建模
## 导入需要的库
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse
import warnings
warnings.simplefilter("ignore")
## 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
"knn": KNeighborsClassifier(n_neighbors=1),
"naive_bayes": GaussianNB(),
"logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
"svc": SVC(kernel="rbf", gamma="auto"),
"decision_tree": DecisionTreeClassifier(),
"random_forest": RandomForestClassifier(n_estimators=100),
"mlp": MLPClassifier()
}
print("加载数据中...")
dataset = load_iris()
trainX, testX, trainY, testY = train_test_split(dataset.data, dataset.target, random_state=1, test_size=0.3)
def echo_model(modelName):
## 训练模型
print("应用 '{}' 模型建模...".format(modelName))
model = models[modelName]
model.fit(trainX, trainY)
## 预测并输出一份分类结果报告
print("评估模型效果...")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))
modelNames = ["knn", "naive_bayes", "logit", "svc", "decision_tree", "random_forest", "mlp"]
for modelName in modelNames:
try:
echo_model(modelName)
except Exception as e:
raise Exception("执行错误:", e)
5. 结果对比
结果中的precision, recall, f1-score, support分别对应 准确率,召回率,F1得分,测试集的样本数量。详细的定义,可以参考以下文章中的分类模型评价部分。https://blog.csdn.net/JasonH2021/article/details/131138612
加载数据中...
应用 'knn' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 0.95 1.00 0.97 18
virginica 1.00 0.92 0.96 13
accuracy 0.98 45
macro avg 0.98 0.97 0.98 45
weighted avg 0.98 0.98 0.98 45
应用 'naive_bayes' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 0.94 0.89 0.91 18
virginica 0.86 0.92 0.89 13
accuracy 0.93 45
macro avg 0.93 0.94 0.93 45
weighted avg 0.94 0.93 0.93 45
应用 'logit' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 1.00 0.94 0.97 18
virginica 0.93 1.00 0.96 13
accuracy 0.98 45
macro avg 0.98 0.98 0.98 45
weighted avg 0.98 0.98 0.98 45
应用 'svc' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 1.00 0.94 0.97 18
virginica 0.93 1.00 0.96 13
accuracy 0.98 45
macro avg 0.98 0.98 0.98 45
weighted avg 0.98 0.98 0.98 45
应用 'decision_tree' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 0.94 0.94 0.94 18
virginica 0.92 0.92 0.92 13
accuracy 0.96 45
macro avg 0.96 0.96 0.96 45
weighted avg 0.96 0.96 0.96 45
应用 'random_forest' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 0.94 0.94 0.94 18
virginica 0.92 0.92 0.92 13
accuracy 0.96 45
macro avg 0.96 0.96 0.96 45
weighted avg 0.96 0.96 0.96 45
应用 'mlp' 模型建模...
评估模型效果...
precision recall f1-score support
setosa 1.00 1.00 1.00 14
versicolor 1.00 0.89 0.94 18
virginica 0.87 1.00 0.93 13
accuracy 0.96 45
macro avg 0.96 0.96 0.96 45
weighted avg 0.96 0.96 0.96 45
6. 模型选择与调优
从不同算法在测试集上的表现来看,就综合/平均准确率(weighted avg - percision)而言,
K近邻 98%
贝叶斯 94%
逻辑回归 98%
SVC 98%
决策树 96%
随机森林 96%
前馈神经网络 96%
其中,K近邻,逻辑回归, SVC的表现良好,准确率在98%以上。
也从结果上反映了SVC和K近邻在小样本上的优势,以及逻辑回归在简单分类问题上的强大实力。
就本案例中的分类问题而言,用到的算法基本上都表现良好,可以根据实际的需求进行选择和进一步的调优。
四、小结
本文借助入门级的鸢尾花分类问题,简单介绍了机器学习建模的步骤,sklearn的调用方法,以及模型的评价等。