机器学习 3 大核心任务实战:从回归、分类到聚类,Python 代码全解析
机器学习 3 大核心任务实战:从回归、分类到聚类,Python 代码全解析
机器学习作为人工智能的重要分支,正在深刻改变我们解决问题的方式。无论是预测房价、识别图像还是分析客户行为,机器学习都展现出强大的能力。本文将带你深入实战,通过 Python 代码全面解析机器学习的三大核心任务:回归、分类和聚类。
1. 机器学习基础与环境准备
在开始实战之前,我们需要搭建合适的开发环境并理解机器学习的基本概念。机器学习主要分为监督学习、无监督学习和强化学习三大类。本文将重点介绍前两类中的典型任务。
1.1 环境配置
首先确保你的 Python 环境已安装以下核心库:
pip install numpy pandas matplotlib scikit-learn这些库构成了 Python 机器学习的基础生态:
- NumPy:高效的数值计算
- Pandas:数据处理与分析
- Matplotlib:数据可视化
- Scikit-learn:机器学习算法实现
1.2 数据准备的基本原则
无论哪种机器学习任务,高质量的数据准备都是成功的关键。以下是一些通用原则:
- 数据清洗:处理缺失值、异常值和重复数据
- 特征工程:选择合适的特征并进行必要的转换
- 数据分割:将数据集分为训练集和测试集
- 标准化:对数值特征进行标准化处理
from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 示例数据分割与标准化流程 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test)2. 回归任务实战:房价预测
回归分析用于预测连续数值,是机器学习中最基础也最常用的任务之一。我们以经典的波士顿房价数据集为例,演示完整的回归分析流程。
2.1 数据探索与可视化
首先加载数据并了解其特征分布:
import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import fetch_california_housing # 加载加州房价数据集 data = fetch_california_housing() df = pd.DataFrame(data.data, columns=data.feature_names) df['MedHouseVal'] = data.target # 绘制特征与目标变量的关系 plt.figure(figsize=(12, 8)) for i, col in enumerate(data.feature_names): plt.subplot(3, 3, i+1) plt.scatter(df[col], df['MedHouseVal'], alpha=0.3) plt.xlabel(col) plt.ylabel('Median House Value') plt.tight_layout() plt.show()2.2 线性回归模型实现
线性回归是最简单的回归模型,但理解其原理至关重要:
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 创建并训练模型 lr = LinearRegression() lr.fit(X_train_scaled, y_train) # 评估模型 y_pred = lr.predict(X_test_scaled) print(f"MSE: {mean_squared_error(y_test, y_pred):.2f}") print(f"R²: {r2_score(y_test, y_pred):.2f}") # 可视化预测结果 plt.scatter(y_test, y_pred) plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--') plt.xlabel('Actual') plt.ylabel('Predicted') plt.title('Actual vs Predicted House Values') plt.show()2.3 高级回归技术
当线性回归表现不佳时,可以尝试更复杂的模型:
from sklearn.ensemble import RandomForestRegressor # 随机森林回归 rf = RandomForestRegressor(n_estimators=100, random_state=42) rf.fit(X_train_scaled, y_train) y_pred_rf = rf.predict(X_test_scaled) # 评估改进效果 print(f"RF MSE: {mean_squared_error(y_test, y_pred_rf):.2f}") print(f"RF R²: {r2_score(y_test, y_pred_rf):.2f}") # 特征重要性分析 importances = rf.feature_importances_ plt.barh(data.feature_names, importances) plt.title('Feature Importances') plt.show()3. 分类任务实战:鸢尾花种类识别
分类任务是机器学习中最常见的监督学习问题,我们以经典的鸢尾花数据集为例,演示完整的分类流程。
3.1 数据集介绍与探索
鸢尾花数据集包含三种花的四个特征:
from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target # 创建DataFrame方便分析 iris_df = pd.DataFrame(X, columns=iris.feature_names) iris_df['species'] = y # 可视化特征分布 pd.plotting.scatter_matrix(iris_df, c=y, figsize=(12, 12), marker='o') plt.show()3.2 逻辑回归分类器
虽然名为回归,但逻辑回归是经典的线性分类算法:
from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix # 数据分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 创建并训练模型 logreg = LogisticRegression(max_iter=200) logreg.fit(X_train, y_train) # 评估模型 y_pred = logreg.predict(X_test) print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred)) # 可视化决策边界(以两个特征为例) plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis') plt.xlabel(iris.feature_names[0]) plt.ylabel(iris.feature_names[1]) # 绘制决策边界 xx, yy = np.meshgrid(np.linspace(4, 8, 100), np.linspace(1.5, 4.5, 100)) Z = logreg.predict(np.c_[xx.ravel(), yy.ravel(), np.zeros_like(xx.ravel()), np.zeros_like(xx.ravel())]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.2, cmap='viridis') plt.show()3.3 支持向量机(SVM)应用
SVM是强大的分类算法,特别适合高维数据:
from sklearn.svm import SVC # 创建SVM模型 svm = SVC(kernel='rbf', C=1.0, gamma='scale') svm.fit(X_train, y_train) # 评估模型 y_pred_svm = svm.predict(X_test) print(classification_report(y_test, y_pred_svm)) # 可视化决策边界 Z = svm.predict(np.c_[xx.ravel(), yy.ravel(), np.zeros_like(xx.ravel()), np.zeros_like(xx.ravel())]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.2, cmap='viridis') plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis') plt.show()4. 聚类任务实战:客户细分分析
聚类是无监督学习的重要技术,用于发现数据中的自然分组。我们使用客户数据集演示K-Means聚类。
4.1 数据准备与探索
from sklearn.datasets import make_blobs # 生成模拟客户数据 X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) plt.scatter(X[:, 0], X[:, 1], s=50) plt.show()4.2 K-Means聚类实现
K-Means是最常用的聚类算法:
from sklearn.cluster import KMeans # 确定最佳K值 - 肘部法则 wcss = [] for i in range(1, 11): kmeans = KMeans(n_clusters=i, init='k-means++', random_state=42) kmeans.fit(X) wcss.append(kmeans.inertia_) plt.plot(range(1, 11), wcss) plt.title('The Elbow Method') plt.xlabel('Number of clusters') plt.ylabel('WCSS') plt.show() # 应用K=4的K-Means kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42) y_kmeans = kmeans.fit_predict(X) # 可视化聚类结果 plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis') centers = kmeans.cluster_centers_ plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X') plt.show()4.3 聚类评估与优化
评估聚类质量是重要步骤:
from sklearn.metrics import silhouette_score # 轮廓系数评估 score = silhouette_score(X, y_kmeans) print(f"Silhouette Score: {score:.2f}") # 尝试不同初始化方法比较效果 init_methods = ['k-means++', 'random'] for method in init_methods: kmeans = KMeans(n_clusters=4, init=method, random_state=42) y_kmeans = kmeans.fit_predict(X) score = silhouette_score(X, y_kmeans) print(f"Method: {method}, Score: {score:.2f}")5. 模型优化与实战技巧
掌握了基础算法后,我们需要了解如何提升模型性能。
5.1 交叉验证与超参数调优
from sklearn.model_selection import GridSearchCV # 为SVM寻找最佳参数 param_grid = {'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001]} grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2) grid.fit(X_train, y_train) print(f"Best parameters: {grid.best_params_}") print(f"Best estimator: {grid.best_estimator_}") # 使用最佳模型预测 grid_predictions = grid.predict(X_test) print(classification_report(y_test, grid_predictions))5.2 特征选择与降维
from sklearn.decomposition import PCA # PCA降维可视化 pca = PCA(n_components=2) principalComponents = pca.fit_transform(X) plt.scatter(principalComponents[:, 0], principalComponents[:, 1], c=y_kmeans) plt.xlabel('Principal Component 1') plt.ylabel('Principal Component 2') plt.show() # 解释方差比 print(f"Explained variance ratio: {pca.explained_variance_ratio_}")5.3 模型集成技术
from sklearn.ensemble import VotingClassifier from sklearn.tree import DecisionTreeClassifier # 创建多个分类器 clf1 = LogisticRegression(random_state=1) clf2 = DecisionTreeClassifier(random_state=1) clf3 = SVC(probability=True, random_state=1) # 投票集成 eclf = VotingClassifier(estimators=[('lr', clf1), ('dt', clf2), ('svc', clf3)], voting='soft') eclf.fit(X_train, y_train) # 评估集成模型 y_pred_eclf = eclf.predict(X_test) print(classification_report(y_test, y_pred_eclf))6. 项目部署与生产化建议
将机器学习模型投入实际应用需要考虑更多因素:
6.1 模型持久化
import joblib # 保存模型 joblib.dump(rf, 'house_price_rf_model.pkl') # 加载模型 loaded_model = joblib.load('house_price_rf_model.pkl')6.2 构建预测API
使用Flask构建简单API:
from flask import Flask, request, jsonify import numpy as np app = Flask(__name__) @app.route('/predict', methods=['POST']) def predict(): data = request.get_json() features = np.array(data['features']).reshape(1, -1) prediction = loaded_model.predict(features) return jsonify({'prediction': prediction.tolist()}) if __name__ == '__main__': app.run(debug=True)6.3 监控与维护
生产环境中需要考虑:
- 模型性能随时间变化
- 数据漂移检测
- 自动化重新训练流程
- 模型版本控制
在实际项目中,我发现特征工程的质量往往比算法选择更重要。花时间深入理解业务领域和数据特性,通常能带来比单纯调参更大的模型性能提升。
