机器学习实战:如何用Python实现监督学习、非监督学习和强化学习?
·
机器学习实战:Python实现三大学习范式的全流程指南
当你第一次听说机器学习能自动识别猫狗照片、预测股票走势甚至打败围棋世界冠军时,是否好奇这些"魔法"背后的技术原理?作为开发者,我们更关心的是如何用代码将这些理论落地。本文将带你用Python从零实现监督学习、非监督学习和强化学习的典型应用场景,使用scikit-learn和TensorFlow等工具库完成从数据准备到模型部署的全流程。
1. 环境准备与工具链搭建
工欲善其事,必先利其器。在开始机器学习实践前,需要配置好Python开发环境。推荐使用Anaconda管理环境,它能完美解决依赖冲突问题:
conda create -n ml_demo python=3.8
conda activate ml_demo
核心工具库安装清单:
| 库名称 | 版本要求 | 主要用途 |
|---|---|---|
| numpy | ≥1.19 | 数值计算基础库 |
| pandas | ≥1.2 | 数据清洗与分析 |
| matplotlib | ≥3.3 | 可视化工具 |
| scikit-learn | ≥0.24 | 传统机器学习算法实现 |
| tensorflow | ≥2.4 | 深度学习框架 |
| opencv-python | ≥4.5 | 图像处理辅助 |
提示:如果使用GPU加速,需要额外配置CUDA和cuDNN。建议初学者先使用CPU版本熟悉流程。
验证安装是否成功:
import sklearn
print(sklearn.__version__) # 应显示0.24.0以上版本
2. 监督学习实战:从鸢尾花分类到房价预测
监督学习如同有参考答案的闭卷考试,我们需要同时提供输入特征和对应标签。下面以经典鸢尾花数据集为例,演示完整的建模流程。
2.1 数据加载与探索
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
print(df.describe())
关键数据特征:
- 样本量:150(每类50个)
- 特征维度:4(花萼长宽、花瓣长宽)
- 分类数:3(Setosa/Versicolor/Virginica)
2.2 模型训练与评估
我们对比三种经典算法效果:
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
X_train, X_test, y_train, y_test = train_test_split(
iris.data, iris.target, test_size=0.3)
models = {
"KNN": KNeighborsClassifier(n_neighbors=3),
"SVM": SVC(kernel='linear'),
"RandomForest": RandomForestClassifier(n_estimators=100)
}
for name, model in models.items():
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
print(f"{name} 准确率: {score:.2%}")
典型输出结果:
- KNN 准确率: 97.78%
- SVM 准确率: 95.56%
- RandomForest 准确率: 100.00%
2.3 回归问题实战:波士顿房价预测
监督学习同样适用于回归问题:
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
housing = fetch_california_housing()
X_train, X_test, y_train, y_test = train_test_split(
housing.data, housing.target, test_size=0.2)
lr = LinearRegression()
lr.fit(X_train, y_train)
print(f"R2分数: {lr.score(X_test, y_test):.3f}")
注意:回归问题评估常用R2分数和MSE,分类问题则关注准确率和F1值。
3. 非监督学习实战:客户分群与降维可视化
当数据没有标签时,非监督学习能发现隐藏模式。我们以商场客户数据为例进行聚类分析。
3.1 K-Means聚类实现
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 模拟客户年消费额和访问频率数据
X = np.random.rand(300,2) * 10
X[:100] += [15, 20] # 高价值客户
X[100:200] += [5, 10] # 中等客户
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
plt.scatter(X[:,0], X[:,1], c=kmeans.labels_)
plt.show()
3.2 降维技术PCA实战
高维数据可视化需要降维:
from sklearn.decomposition import PCA
# 使用之前的鸢尾花数据
pca = PCA(n_components=2)
X_pca = pca.fit_transform(iris.data)
plt.scatter(X_pca[:,0], X_pca[:,1], c=iris.target)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
关键输出解读:
- 第一主成分解释方差比:通常显示92%以上
- 第二主成分解释方差比:通常5%左右
- 两个主成分累计解释97%以上方差
4. 强化学习实战:Q-Learning实现迷宫游戏
强化学习通过试错学习最优策略。我们用Q-Learning算法实现智能体自主走出迷宫。
4.1 迷宫环境构建
import numpy as np
# 定义5x5迷宫,1表示墙,0表示通路
maze = np.array([
[0, 1, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]
])
goal = (4, 4) # 出口位置
4.2 Q-Learning算法实现
# 初始化Q表
q_table = np.zeros((maze.size, 4)) # 状态数 x 动作数(上,下,左,右)
# 超参数设置
alpha = 0.1 # 学习率
gamma = 0.9 # 折扣因子
epsilon = 0.1 # 探索率
for episode in range(1000):
state = (0, 0) # 起点
while state != goal:
if np.random.uniform(0, 1) < epsilon:
action = np.random.randint(4) # 探索
else:
action = np.argmax(q_table[state[0]*5 + state[1]]) # 利用
# 执行动作并获取新状态和奖励
next_state, reward = move(maze, state, action)
# Q值更新
old_value = q_table[state[0]*5 + state[1], action]
next_max = np.max(q_table[next_state[0]*5 + next_state[1]])
new_value = (1 - alpha) * old_value + alpha * (reward + gamma * next_max)
q_table[state[0]*5 + state[1], action] = new_value
state = next_state
提示:实际实现需要补全move函数处理边界条件和奖励设置(到达目标+10,撞墙-5,普通移动-1)
4.3 策略测试与可视化
训练完成后,可以用最优策略走迷宫:
state = (0, 0)
path = [state]
while state != goal:
action = np.argmax(q_table[state[0]*5 + state[1]])
state, _ = move(maze, state, action)
path.append(state)
print("最优路径:", path)
5. 工程化实践:模型部署与性能优化
当模型开发完成后,需要考虑实际部署问题。以下是关键考量点:
模型保存与加载
import joblib
# 保存模型
joblib.dump(model, 'iris_classifier.pkl')
# 加载模型
clf = joblib.load('iris_classifier.pkl')
Web服务封装示例(使用Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
model = joblib.load('iris_classifier.pkl')
@app.route('/predict', methods=['POST'])
def predict():
data = request.json
features = [data['sepal_length'], data['sepal_width'],
data['petal_length'], data['petal_width']]
prediction = model.predict([features])[0]
return jsonify({'class': iris.target_names[prediction]})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
性能优化技巧
-
特征工程决定上限:
- 分箱处理连续特征
- 使用PCA降维
- 异常值检测与处理
-
超参数调优方法:
from sklearn.model_selection import GridSearchCV params = {'n_neighbors': [3,5,7], 'weights': ['uniform', 'distance']} grid = GridSearchCV(KNeighborsClassifier(), params, cv=5) grid.fit(X_train, y_train) print(f"最佳参数: {grid.best_params_}") -
计算加速方案:
- 使用
numba加速数值计算 - 开启
scikit-learn的n_jobs参数并行计算 - 对大规模数据考虑增量学习(
partial_fit)
- 使用
更多推荐


所有评论(0)