项目目标:
使用 Scikit-learn 库构建一个分类模型,根据鸢尾花的花萼和花瓣特征预测其品种(setosa, versicolor, virginica)
环境准备
# 所需库安装(如果未安装)
# pip install numpy pandas matplotlib scikit-learn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
完整代码实现
步骤 1: 加载数据集
# 加载内置的鸢尾花数据集
iris = datasets.load_iris()
X = iris.data # 特征数据 (花萼长宽, 花瓣长宽)
y = iris.target # 目标变量 (0,1,2 对应三种花)
feature_names = iris.feature_names
target_names = iris.target_names
print("特征名称:", feature_names)
print("类别名称:", target_names)
步骤 2: 数据探索
# 转换为DataFrame方便查看
df = pd.DataFrame(X, columns=feature_names)
df['target'] = y
print("\n数据样例:")
print(df.head())
# 统计信息
print("\n数据统计:")
print(df.describe())
# 可视化特征分布
plt.figure(figsize=(12,6))
for i in range(4):
plt.subplot(2,2,i+1)
plt.hist(X[:,i], bins=20)
plt.title(feature_names[i])
plt.tight_layout()
plt.show()
步骤 3: 数据预处理
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"\n训练集大小: {X_train.shape[0]}")
print(f"测试集大小: {X_test.shape[0]}")
步骤 4: 模型训练
# 创建逻辑回归模型
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
# 查看训练准确率
train_acc = model.score(X_train, y_train)
print(f"\n训练集准确率: {train_acc:.2f}")
步骤 5: 模型评估
# 测试集预测
y_pred = model.predict(X_test)
# 计算准确率
test_acc = accuracy_score(y_test, y_pred)
print(f"测试集准确率: {test_acc:.2f}")
# 详细分类报告
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=target_names))
# 混淆矩阵可视化
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_predictions(y_test, y_pred,
display_labels=target_names,
cmap=plt.cm.Blues)
plt.title("Confusion Matrix")
plt.show()
步骤 6: 应用模型
# 使用新数据进行预测
new_data = [[5.1, 3.5, 1.4, 0.2], # 示例数据1
[6.7, 3.0, 5.2, 2.3]] # 示例数据2
predictions = model.predict(new_data)
probabilities = model.predict_proba(new_data)
for i, pred in enumerate(predictions):
print(f"\n样本 {i+1}:")
print(f"预测类别: {target_names[pred]}")
print(f"各类别概率: {dict(zip(target_names, probabilities[i].round(3)))}")
输出示例
特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
类别名称: ['setosa' 'versicolor' 'virginica']
训练集准确率: 0.97
测试集准确率: 1.00
分类报告:
precision recall f1-score support
setosa 1.00 1.00 1.00 10
versicolor 1.00 1.00 1.00 10
virginica 1.00 1.00 1.00 10
accuracy 1.00 30
macro avg 1.00 1.00 1.00 30
weighted avg 1.00 1.00 1.00 30
关键点说明
数据划分: 使用
train_test_split
确保数据分布一致(stratify=y)模型选择: 逻辑回归适合多分类问题,也可尝试 SVM、决策树等其他算法
评估指标: 除了准确率,关注 precision/recall 等更细致的指标
可视化: 帮助理解数据分布和模型表现‘’
扩展建议
尝试不同分类器(如
SVC
,RandomForest
)进行特征工程(如特征缩放、PCA降维)
使用交叉验证优化模型参数
部署模型为简单 Web 应用(使用 Flask)