Python 机器学习入门:Scikit-learn 核心算法实战(分类 / 回归)

3次阅读
没有评论

共计 6546 个字符,预计需要花费 17 分钟才能阅读完成。

在当今数据驱动的世界中,机器学习已成为一项核心技术,广泛应用于推荐系统、图像识别、自然语言处理等领域。对于希望进入这个激动人彩的领域的初学者来说,Python 凭借其简洁的语法和丰富的库生态,无疑是最佳选择。而在 Python 的机器学习库中,Scikit-learn 因其易用性、高效性以及广泛的算法覆盖,成为了入门和实战的首选工具。

本文将带领你深入理解 Python 机器学习的入门之路,重点聚焦 Scikit-learn 这一强大工具。我们将从零开始,实战分类与回归两大核心任务,揭示 Scikit-learn 如何让复杂的机器学习算法变得触手可及。

为什么选择 Python 和 Scikit-learn 进行机器学习?

Python:

  • 简洁易学: 语法清晰,非常适合初学者。
  • 丰富的库生态: 除了 Scikit-learn,还有 NumPy、Pandas 用于数据处理,Matplotlib、Seaborn 用于数据可视化,以及 TensorFlow、PyTorch 等深度学习框架。
  • 社区活跃: 遇到问题时,很容易找到解决方案和资源。

Scikit-learn:

  • 统一的 API: 所有算法都遵循 fit() 训练、predict() 预测的统一模式,学习成本低。
  • 全面的算法: 涵盖了分类、回归、聚类、降维等多种机器学习任务。
  • 高效且稳定: 基于 NumPy 和 SciPy 构建,性能优异。
  • 文档完善: 官方文档详细,示例丰富,是学习的绝佳资源。

如果你渴望用数据发现洞察,用模型预测未来,那么 Scikit-learn 就是你开启机器学习旅程的理想伙伴。

机器学习的核心流程

无论你处理的是分类问题还是回归问题,机器学习项目都遵循一套标准化的流程:

  1. 数据收集与加载: 获取原始数据,并将其加载到 Python 环境中(通常使用 Pandas DataFrame)。
  2. 数据探索与预处理:
    • 探索性数据分析 (EDA): 理解数据结构、特征类型、缺失值、异常值等。
    • 特征工程: 从原始数据中创建新的特征,或转换现有特征,以提高模型性能。
    • 数据清洗: 处理缺失值(填充、删除)、异常值。
    • 数据编码: 将分类变量转换为数值形式(如独热编码)。
    • 特征缩放: 对数值特征进行标准化或归一化,以避免某些特征对模型产生过大影响。
  3. 模型选择: 根据任务类型(分类 / 回归)、数据量、特征类型以及对模型解释性的需求,选择合适的机器学习算法。
  4. 模型训练: 将准备好的数据集(通常是训练集)输入到选定的模型中,让模型学习数据中的模式。
  5. 模型评估: 使用独立的测试集来评估模型在未见过的数据上的表现,衡量其准确性、泛化能力。
  6. 模型优化与调参: 根据评估结果,调整模型参数(超参数),或尝试其他模型,以提升性能。
  7. 模型部署与预测: 将训练好的模型投入实际应用,对新数据进行预测。

Scikit-learn 提供了所有这些步骤所需的功能,极大地简化了开发流程。

分类与回归:监督学习的两大基石

在机器学习中,监督学习 是一种最常见的范式,它通过从带有标签(即已知正确答案)的数据中学习来构建模型。分类和回归是监督学习的两个主要子类别。

分类 (Classification)

分类任务的目标是预测一个 离散的类别标签。这意味着模型的输出是有限的、预定义的类别之一。

常见应用场景:

  • 垃圾邮件检测: 判断邮件是“垃圾邮件”还是“非垃圾邮件”。
  • 图像识别: 识别图片中的物体是“猫”、“狗”还是“鸟”。
  • 疾病诊断: 根据症状判断病人是否患有某种“疾病 A”、“疾病 B”或“健康”。
  • 客户流失预测: 预测客户是会“流失”还是“不流失”。

Scikit-learn 中的分类算法示例:

  • LogisticRegression (逻辑回归)
  • SVC (支持向量分类器)
  • DecisionTreeClassifier (决策树分类器)
  • RandomForestClassifier (随机森林分类器)
  • KNeighborsClassifier (K 近邻分类器)

回归 (Regression)

回归任务的目标是预测一个 连续的数值输出。这意味着模型的输出是一个范围内的任意实数值。

常见应用场景:

  • 房价预测: 根据房屋特征预测其“具体售价”。
  • 股票价格预测: 预测未来某只股票的“收盘价”。
  • 气温预测: 预测明天的“最高气温”。
  • 销售额预测: 预测下个月的“产品销售额”。

Scikit-learn 中的回归算法示例:

  • LinearRegression (线性回归)
  • SVR (支持向量回归)
  • DecisionTreeRegressor (决策树回归器)
  • RandomForestRegressor (随机森林回归器)
  • KNeighborsRegressor (K 近邻回归器)

现在,让我们通过具体的代码示例来实战 Scikit-learn 的分类和回归能力。

实战:使用 Scikit-learn 进行分类

我们将使用经典的鸢尾花 (Iris) 数据集,它包含三种鸢尾花的特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度),目标是根据这些特征预测鸢尾花的种类。这是一个典型的多类别分类问题。

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, classification_report

# 1. 数据加载
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = pd.Series(iris.target)

print("特征数据前 5 行:")
print(X.head())
print("n 目标数据前 5 行:")
print(y.head())
print("n 目标类别名称:", iris.target_names)

# 2. 数据预处理 - 特征缩放 (标准化)
# K 近邻算法对特征尺度敏感,进行标准化是必要的
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled = pd.DataFrame(X_scaled, columns=iris.feature_names)

print("n 标准化后特征数据前 5 行:")
print(X_scaled.head())

# 3. 划分训练集和测试集
# test_size=0.3 表示 30% 的数据用于测试
# random_state 用于确保每次运行划分结果一致
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)

print(f"n 训练集样本数: {X_train.shape[0]}")
print(f"测试集样本数: {X_test.shape[0]}")

# 4. 模型选择与训练
# 这里我们选择 K- 近邻 (KNeighborsClassifier) 分类器
# n_neighbors=3 表示选择最近的 3 个邻居进行投票
knn_classifier = KNeighborsClassifier(n_neighbors=3)
knn_classifier.fit(X_train, y_train) # 使用训练集进行模型训练

print("nK- 近邻分类器训练完成!")

# 5. 模型预测
y_pred = knn_classifier.predict(X_test)

# 6. 模型评估
accuracy = accuracy_score(y_test, y_pred)
print(f"n 模型在测试集上的准确率: {accuracy:.4f}")

print("n 分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

代码解析:

  • 我们首先加载 Iris 数据集,并将其转换为 Pandas DataFrame 以便查看。
  • 使用 StandardScaler 对特征进行标准化,这是许多算法(如 K- 近邻)的推荐做法,可以避免某些特征因数值范围过大而主导模型训练。
  • train_test_split 将数据分为训练集和测试集,确保模型在未见过的数据上进行评估。
  • 我们选择了 KNeighborsClassifier,并通过 fit() 方法在训练集上训练模型。
  • predict() 方法用于在测试集上生成预测结果。
  • accuracy_scoreclassification_report 用于评估模型的性能,报告中包含了准确率、精确度、召回率和 F1- 分数等指标。

实战:使用 Scikit-learn 进行回归

接下来,我们将创建一个简单的合成数据集,用于演示线性回归。我们的目标是根据输入特征 X 预测连续的输出值 y

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler # 回归有时也需要标准化

# 1. 数据生成 (为了演示方便,生成一个简单的线性关系数据)
# 使用 np.random.rand 生成随机数,np.linspace 创建等间隔数值
np.random.seed(0)
X = np.random.rand(100, 1) * 10 # 100 个样本,1 个特征,范围 0 -10
y = 2 * X + 1 + np.random.randn(100, 1) * 2 # y = 2x + 1 + 噪声

print("特征数据前 5 行:")
print(X[:5].flatten())
print("n 目标数据前 5 行:")
print(y[:5].flatten())

# 可视化原始数据
plt.figure(figsize=(8, 6))
plt.scatter(X, y, color='blue', label='原始数据点')
plt.title('原始数据散点图')
plt.xlabel('特征 X')
plt.ylabel('目标 Y')
plt.legend()
plt.grid(True)
plt.show()

# 2. 数据预处理 (这里对回归任务,线性回归通常不需要标准化,但对于其他模型可能需要)
# 为了演示完整性,我们也可以对 X 进行标准化,但对简单的线性回归影响不大
scaler_reg = StandardScaler()
X_scaled_reg = scaler_reg.fit_transform(X)

# 3. 划分训练集和测试集
X_train_reg, X_test_reg, y_train_reg, y_test_reg = train_test_split(X_scaled_reg, y, test_size=0.3, random_state=42)

print(f"n 回归训练集样本数: {X_train_reg.shape[0]}")
print(f"回归测试集样本数: {X_test_reg.shape[0]}")

# 4. 模型选择与训练
# 选择线性回归模型
linear_regressor = LinearRegression()
linear_regressor.fit(X_train_reg, y_train_reg) # 在训练集上训练模型

print("n 线性回归模型训练完成!")
print(f"模型截距 (Intercept): {linear_regressor.intercept_[0]:.4f}")
print(f"模型系数 (Coefficient): {linear_regressor.coef_[0][0]:.4f}")

# 5. 模型预测
y_pred_reg = linear_regressor.predict(X_test_reg)

# 6. 模型评估
mse = mean_squared_error(y_test_reg, y_pred_reg)
r2 = r2_score(y_test_reg, y_pred_reg)

print(f"n 模型在测试集上的均方误差 (Mean Squared Error): {mse:.4f}")
print(f"模型在测试集上的 R² 分数 (R-squared): {r2:.4f}")

# 可视化预测结果
plt.figure(figsize=(8, 6))
plt.scatter(scaler_reg.inverse_transform(X_test_reg), y_test_reg, color='blue', label='真实值')
plt.scatter(scaler_reg.inverse_transform(X_test_reg), y_pred_reg, color='red', label='预测值', alpha=0.7)
plt.plot(scaler_reg.inverse_transform(X_test_reg), y_pred_reg, color='green', linewidth=2, linestyle='--', label='回归线') # 回归线
plt.title('线性回归模型预测结果')
plt.xlabel('特征 X')
plt.ylabel('目标 Y')
plt.legend()
plt.grid(True)
plt.show()

代码解析:

  • 我们使用 numpy 生成了一个具有线性关系和少量噪声的合成数据集。
  • 同样使用 train_test_split 划分数据集。
  • 选择了 LinearRegression 模型,并通过 fit() 进行训练。线性回归会学习特征与目标之间的最佳线性关系(即斜率和截距)。
  • predict() 用于生成预测值。
  • 回归模型的评估指标不同于分类:
    • mean_squared_error (均方误差, MSE):预测值与真实值之差平方的平均值,值越小越好。
    • r2_score (R² 分数):表示模型解释了多少因变量的方差,值越接近 1 越好。

进阶之路:超越入门

掌握了分类和回归的基础实战后,你的机器学习之旅才刚刚开始。以下是一些值得探索的进阶方向:

  • 更多 Scikit-learn 算法: 尝试 RandomForestClassifier/RegressorSVC/SVRGradientBoostingClassifier/Regressor 等更复杂的模型。
  • 特征工程: 学习如何从原始数据中提取更有意义的特征,这往往是提升模型性能的关键。
  • 超参数调优: 使用 GridSearchCVRandomizedSearchCV 等技术来寻找模型的最佳参数组合。
  • 交叉验证: 使用 KFoldStratifiedKFold 进行更稳健的模型评估,避免对单一测试集结果的依赖。
  • 管道 (Pipelines): 使用 Pipeline 将数据预处理和模型训练封装成一个流程,提高代码的整洁性和可维护性。
  • 欠拟合与过拟合: 理解这两种常见问题,并学习如何通过正则化、交叉验证等方法来解决。
  • 数据不平衡处理: 对于分类任务,当某些类别的样本数量远少于其他类别时,需要特殊的处理方法(如 SMOTE)。

总结

本文带你从 Python 机器学习的入门阶段出发,深入学习了 Scikit-learn 的核心功能,并实战了分类与回归这两大基石任务。我们了解了机器学习的通用流程,掌握了如何使用 Scikit-learn 加载数据、预处理、训练模型、进行预测以及评估模型性能。

Scikit-learn 以其强大的功能和友好的接口,为数据科学家和机器学习工程师打开了通往智能世界的大门。希望通过这篇入门指南,你已经对 Python 机器学习有了初步的认识,并能充满信心地开启你自己的数据探索之旅。持续学习,不断实践,你将能够驾驭更复杂的数据和挑战,创造出令人惊叹的智能应用!

正文完
 0
评论(没有评论)