机器学习 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 监控与维护
生产环境中需要考虑:
- 模型性能随时间变化
- 数据漂移检测
- 自动化重新训练流程
- 模型版本控制
在实际项目中,我发现特征工程的质量往往比算法选择更重要。花时间深入理解业务领域和数据特性,通常能带来比单纯调参更大的模型性能提升。
更多推荐
所有评论(0)