作者:小白熊
作者简介:精通c#、Halcon、Python、Matlab,擅长机器视觉、机器学习、深度学习、数字图像处理、工业检测识别定位、用户界面设计、目标检测、图像分类、姿态识别、人脸识别、语义分割、路径规划、智能优化算法、大数据分析、各类算法融合创新等等。
联系邮箱:[email protected]
科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~
在本篇博文中,我们将详细介绍如何使用Python及其相关的机器学习库来构建一个用于葡萄酒分类的模型。我们不仅会讲解代码的具体实现,还会深入探讨背后的理论基础,帮助读者更好地理解和应用这些技术。
机器学习是一种让计算机从数据中自动学习的方法。它通过构建模型来解析数据,从而对新数据做出决策或预测。在本案例中,我们将使用逻辑回归模型对葡萄酒数据集进行分类,该数据集包含不同类型的葡萄酒及其化学特性。
逻辑回归(Logistic Regression)是一种广泛使用的分类算法,尽管名字中带有“回归”二字,但它实际上是一种分类方法。逻辑回归通过 logistic 函数(也称为 sigmoid 函数)将线性组合的结果映射到 (0, 1) 区间,从而输出概率值。对于多分类问题,通常使用 softmax 函数来扩展 logistic 回归,使其能够处理多个类别。
数据标准化(Standardization)是数据预处理的一个重要步骤,它通过减去均值并除以标准差,将特征值缩放到零均值和单位方差。这有助于提高模型的收敛速度和性能,尤其是在使用梯度下降等优化算法时。
交叉验证(Cross-Validation)是一种评估模型性能的技术,它通过将数据集划分为多个子集,多次训练和测试模型,从而更准确地估计模型的泛化能力。常见的交叉验证方法有 k 折交叉验证(k-Fold Cross-Validation),即将数据集分成 k 个子集,每次使用 k-1 个子集进行训练,剩下的一个子集进行测试,重复 k 次。
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import seaborn as sns
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
import warnings
加载葡萄酒数据集并进行初步的数据处理,包括检查缺失值和数据标准化。
warnings.filterwarnings("ignore")
# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 加载数据集
data = load_wine()
# 数据转换
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target
# 缺失值检测
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)
# 数据提取
X = df.drop('Target', axis=1)
y = df['Target']
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
将数据集划分为训练集和验证集,以便评估模型的性能。
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
使用逻辑回归模型进行多分类任务,并通过交叉验证评估模型的性能。
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000)
# 十折交叉验证
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')
print(f"平均准确率: {np.mean(cv_scores)}")
# 训练模型
model.fit(X_train, y_train)
对模型在验证集上的表现进行评估,计算各种性能指标。
y_val_pred = model.predict(X_val)
# 计算混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)
# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')
print(f"准确率: {accuracy_val}")
print(f"精确率: {precision_val}")
print(f"召回率: {recall_val}")
print(f"F1分数: {f1_val}")
使用 Seaborn 库可视化混淆矩阵,以便更直观地理解模型的分类效果。
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title(f'混淆矩阵')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import seaborn as sns
from sklearn.datasets import load_wine
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
# 设置中文字体为SimHei
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 加载数据集
data = load_wine()
# 数据转换
df = pd.DataFrame(data.data, columns=data.feature_names)
df['Target'] = data.target
# 缺失值检测
missing_values = df.isnull().sum()
print("缺失值检测结果:\n", missing_values)
# 数据提取
X = df.drop('Target', axis=1)
y = df['Target']
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 构建模型
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=1000)
# 十折交叉验证
kf = KFold(n_splits=10, shuffle=True, random_state=42)
cv_scores = cross_val_score(model, X_train, y_train, cv=kf, scoring='accuracy')
print(f"平均准确率: {np.mean(cv_scores)}")
# 训练模型
model.fit(X_train, y_train)
# 模型预测
y_val_pred = model.predict(X_val)
# 计算混淆矩阵
conf_matrix = confusion_matrix(y_val, y_val_pred)
# 计算分类评估指标
accuracy_val = accuracy_score(y_val, y_val_pred)
precision_val = precision_score(y_val, y_val_pred, average='weighted')
recall_val = recall_score(y_val, y_val_pred, average='weighted')
f1_val = f1_score(y_val, y_val_pred, average='weighted')
print(f"准确率: {accuracy_val}")
print(f"精确率: {precision_val}")
print(f"召回率: {recall_val}")
print(f"F1分数: {f1_val}")
# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title(f'混淆矩阵')
plt.xlabel("预测值")
plt.ylabel("真实值")
plt.show()
通过上述步骤,我们不仅构建了一个可以对葡萄酒进行分类的模型,还深入理解了逻辑回归、数据标准化、交叉验证和性能评估的基本原理。这些知识和技术在许多实际问题中都具有广泛的应用价值,希望本文能为读者提供有益的参考和启发。如果大家有任何问题或建议,欢迎随时交流讨论!