在本教程中,我们将带领您使用Python编程语言实现一个经典的机器学习项目——鸢尾花(Iris)分类。通过这个项目,您将掌握机器学习的基本流程,包括数据加载、预处理、模型训练、评估和优化等步骤。
论文AIGC检测,降AIGC检测,AI降重,三连私信免费获取:
鸢尾花数据集是机器学习领域中广泛使用的标准数据集,包含150个样本,分为三类,每类50个样本,每个样本有四个特征:萼片长度、萼片宽度、花瓣长度和花瓣宽度。我们的目标是根据这些特征,预测鸢尾花的种类。
numpy
:用于科学计算。pandas
:用于数据处理和分析。matplotlib
:用于数据可视化。seaborn
:基于matplotlib的统计数据可视化库。scikit-learn
:用于机器学习建模和评估。使用pip
安装所需的核心库:
pip install numpy pandas scikit-learn matplotlib seaborn jupyter
在开始之前,验证各个库的版本,以确保环境配置正确:
import sys
import numpy as np
import pandas as pd
import sklearn
print(f"Python版本: {sys.version[:5]}")
print(f"Numpy版本: {np.__version__}")
print(f"Pandas版本: {pd.__version__}")
print(f"Scikit-learn版本: {sklearn.__version__}")
鸢尾花数据集包含150个样本,每个样本有四个特征和一个类别标签。特征包括:
类别标签有三类,分别为:
使用scikit-learn
提供的load_iris
函数加载数据集,并将其转换为pandas
的DataFrame格式,方便后续处理:
from sklearn.datasets import load_iris
import pandas as pd
# 加载鸢尾花数据集
iris = load_iris()
# 创建DataFrame
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['species'] = iris.target
df['species'] = df['species'].map({0: 'Setosa', 1: 'Versicolor', 2: 'Virginica'})
使用seaborn
和matplotlib
对数据进行探索性分析,了解数据的分布和特征之间的关系:
import seaborn as sns
import matplotlib.pyplot as plt
# 设置绘图风格
sns.set(style="whitegrid")
# 绘制特征之间的关系图
sns.pairplot(df, hue='species', markers=["o", "s", "D"])
plt.show()
虽然鸢尾花数据集的特征已经比较干净,但在实际应用中,可能需要进行特征选择和标准化处理,以提高模型的性能。这里我们使用StandardScaler
对特征进行标准化,使其均值为0,标准差为1:
from sklearn.preprocessing import StandardScaler
# 初始化标准化器
scaler = StandardScaler()
# 选择特征列
features = iris.feature_names
# 标准化特征
X = scaler.fit_transform(df[features])
# 目标变量
y = df['species']
将数据集划分为训练集和测试集,通常使用70%的数据用于训练,30%的数据用于测试:
from sklearn.model_selection import train_test_split
# 划分数据集,70%训练,30%测试
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
我们将使用多种机器学习算法进行比较,包括:
使用scikit-learn
的cross_val_score
进行交叉验证,评估模型的性能:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
# 初始化模型
models = {
'Logistic Regression': LogisticRegression(max_iter=200),
'LDA': LinearDiscriminantAnalysis(),
'KNN': KNeighborsClassifier(),
'Decision Tree': DecisionTreeClassifier(),
'Naive Bayes': GaussianNB(),
'SVM': SVC()
}
# 评估每个模型
results = {}
for name, model in models.items():
cv_results = cross_val_score(model, X_train, y_train, cv=10, scoring='accuracy')
results[name] = cv_results
print(f'{name}: {cv_results.mean():.4f} ({cv_results.std():.4f})')
将不同模型的交叉验证结果绘制成箱线图,直观比较模型性能:
import matplotlib.pyplot as plt
# 绘制箱线图
plt.figure(figsize=(10, 6))
plt.boxplot(results.values(), labels=results.keys())
plt.title('模型比较')
plt.ylabel('准确率')
plt.show()
K近邻算法的性能很大程度上依赖于邻居的数量(n_neighbors
)。我们可以通过交叉验证来选择最佳的n_neighbors
值。使用GridSearchCV
可以帮助我们自动找到最优超参数。
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
# 设置KNN模型参数网格
param_grid = {'n_neighbors': range(1, 21)}
knn = KNeighborsClassifier()
# 使用GridSearchCV搜索最佳参数
grid_search = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最佳参数和得分
print(f"最佳邻居数量: {grid_search.best_params_['n_neighbors']}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.4f}")
决策树的性能受到树的深度、最小样本分割数等超参数的影响。我们也可以使用GridSearchCV
来调整这些超参数。
from sklearn.tree import DecisionTreeClassifier
# 设置决策树参数网格
param_grid = {
'max_depth': range(1, 11),
'min_samples_split': range(2, 11)
}
dt = DecisionTreeClassifier()
# 使用GridSearchCV搜索最佳参数
grid_search = GridSearchCV(dt, param_grid, cv=10, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最佳参数和得分
print(f"最佳树深度: {grid_search.best_params_['max_depth']}")
print(f"最佳最小样本分割数: {grid_search.best_params_['min_samples_split']}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.4f}")
支持向量机(SVM)的性能可以通过调整核函数(kernel
)和正则化参数(C
)来优化。
from sklearn.svm import SVC
# 设置SVM模型参数网格
param_grid = {
'C': [0.1, 1, 10, 100],
'kernel': ['linear', 'rbf', 'poly']
}
svm = SVC()
# 使用GridSearchCV搜索最佳参数
grid_search = GridSearchCV(svm, param_grid, cv=10, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最佳参数和得分
print(f"最佳C值: {grid_search.best_params_['C']}")
print(f"最佳核函数: {grid_search.best_params_['kernel']}")
print(f"最佳交叉验证得分: {grid_search.best_score_:.4f}")
通过调参后的模型,可以使用测试集来评估最终模型的表现。我们将计算准确率、混淆矩阵以及分类报告来评估模型的效果。
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# 使用最佳模型预测
best_model = grid_search.best_estimator_
# 在测试集上进行预测
y_pred = best_model.predict(X_test)
# 输出评估指标
print(f"准确率: {accuracy_score(y_test, y_pred):.4f}")
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
print("分类报告:")
print(classification_report(y_test, y_pred))
通过本项目,我们实现了对鸢尾花数据集的机器学习分类任务,完成了以下几个关键步骤:
pandas
和seaborn
对数据进行探索性分析,了解数据分布及特征之间的关系。StandardScaler
对特征进行标准化,使得数据适应模型训练。GridSearchCV
进行超参数调优,找到了最优的模型超参数。在本项目中,我们使用了基本的机器学习模型和优化技巧。接下来,您可以考虑以下方向进行扩展:
通过这种方式,您将更深入地理解机器学习的实际应用,并能够将学到的知识应用到其他领域和项目中。
祝你在机器学习的道路上越走越远!