Skip to content

Python机器学习入门 ​

机器学习的基本概念 ​

什么是机器学习 ​

机器学习是人工智能的一个分支,它使计算机能够从数据中学习并做出预测或决策,而无需明确编程。机器学习的核心是算法,这些算法可以从数据中自动学习模式和规律。

机器学习的类型 ​

1. 监督学习 ​

  • 从标记数据中学习(即每个样本都有对应的标签或结果)
  • 目标是学习一个函数,能够将输入映射到输出
  • 常见算法:线性回归、逻辑回归、决策树、随机森林、支持向量机、神经网络等
  • 应用场景:预测房价、图像分类、语音识别等

2. 无监督学习 ​

  • 从未标记数据中学习(即样本没有对应的标签或结果)
  • 目标是发现数据中的模式和结构
  • 常见算法:聚类(K-means、层次聚类)、降维(PCA、t-SNE)、关联规则学习等
  • 应用场景:客户分群、异常检测、数据可视化等

3. 半监督学习 ​

  • 结合标记数据和未标记数据进行学习
  • 标记数据通常较少,未标记数据较多
  • 应用场景:图像分类、文本分类等

4. 强化学习 ​

  • 智能体通过与环境交互学习最优策略
  • 智能体执行动作,环境反馈奖励或惩罚
  • 常见算法:Q-learning、深度Q网络(DQN)、策略梯度等
  • 应用场景:游戏AI、机器人控制、自动驾驶等

机器学习的工作流程 ​

  1. 数据收集:获取相关的数据集
  2. 数据预处理:清洗数据、处理缺失值、特征缩放等
  3. 特征工程:选择、提取和构建有用的特征
  4. 模型选择:选择合适的机器学习算法
  5. 模型训练:使用训练数据训练模型
  6. 模型评估:使用测试数据评估模型性能
  7. 模型优化:调整模型参数,提高模型性能
  8. 模型部署:将模型部署到生产环境

常用的Python机器学习库 ​

1. NumPy ​

  • 提供强大的N维数组对象
  • 用于数值计算和矩阵运算
  • 是许多机器学习库的基础

2. Pandas ​

  • 提供数据结构(Series和DataFrame)用于数据处理和分析
  • 用于数据清洗、预处理和特征工程

3. Matplotlib和Seaborn ​

  • 用于数据可视化
  • 绘制图表、散点图、直方图等

4. Scikit-learn ​

  • 最流行的Python机器学习库
  • 提供了广泛的监督和无监督学习算法
  • 包含数据预处理、特征选择、模型评估等工具

5. TensorFlow和Keras ​

  • TensorFlow:Google开发的深度学习框架
  • Keras:高级神经网络API,可运行在TensorFlow、Theano或CNTK之上
  • 用于构建和训练深度神经网络

6. PyTorch ​

  • Facebook开发的深度学习框架
  • 动态计算图,便于调试
  • 用于构建和训练深度神经网络

7. XGBoost和LightGBM ​

  • 高性能的梯度提升框架
  • 用于分类和回归任务
  • 在许多机器学习竞赛中表现出色

安装常用库 ​

bash
# 安装基础库
pip install numpy pandas matplotlib seaborn

# 安装Scikit-learn
pip install scikit-learn

# 安装TensorFlow和Keras
pip install tensorflow

# 安装PyTorch
# 访问https://pytorch.org/get-started/locally/获取适合您系统的安装命令

# 安装XGBoost和LightGBM
pip install xgboost lightgbm
# 安装基础库
pip install numpy pandas matplotlib seaborn

# 安装Scikit-learn
pip install scikit-learn

# 安装TensorFlow和Keras
pip install tensorflow

# 安装PyTorch
# 访问https://pytorch.org/get-started/locally/获取适合您系统的安装命令

# 安装XGBoost和LightGBM
pip install xgboost lightgbm

入门示例1:线性回归 ​

线性回归是一种用于预测连续值的监督学习算法。它假设输入特征和输出之间存在线性关系。

数据准备 ​

python
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

# 生成模拟数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 可视化数据
plt.scatter(X, y)
plt.xlabel('X')
plt.ylabel('y')
plt.title('模拟数据')
plt.show()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
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

# 生成模拟数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 可视化数据
plt.scatter(X, y)
plt.xlabel('X')
plt.ylabel('y')
plt.title('模拟数据')
plt.show()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

模型训练 ​

python
# 创建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 查看模型参数
print(f"斜率: {model.coef_[0][0]}")
print(f"截距: {model.intercept_[0]}")
# 创建线性回归模型
model = LinearRegression()

# 训练模型
model.fit(X_train, y_train)

# 查看模型参数
print(f"斜率: {model.coef_[0][0]}")
print(f"截距: {model.intercept_[0]}")

模型评估 ​

python
# 预测测试集
y_pred = model.predict(X_test)

# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R²): {r2}")

# 可视化预测结果
plt.scatter(X_test, y_test, color='blue', label='真实值')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='预测值')
plt.xlabel('X')
plt.ylabel('y')
plt.title('线性回归预测结果')
plt.legend()
plt.show()
# 预测测试集
y_pred = model.predict(X_test)

# 计算评估指标
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R²): {r2}")

# 可视化预测结果
plt.scatter(X_test, y_test, color='blue', label='真实值')
plt.plot(X_test, y_pred, color='red', linewidth=2, label='预测值')
plt.xlabel('X')
plt.ylabel('y')
plt.title('线性回归预测结果')
plt.legend()
plt.show()

入门示例2:分类问题(鸢尾花分类) ​

鸢尾花分类是一个经典的分类问题,我们将使用逻辑回归或支持向量机来预测鸢尾花的种类。

数据准备 ​

python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 查看数据集信息
print(f"特征名称: {iris.feature_names}")
print(f"目标名称: {iris.target_names}")
print(f"数据集形状: {X.shape}")
print(f"目标形状: {y.shape}")

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target

# 查看数据集信息
print(f"特征名称: {iris.feature_names}")
print(f"目标名称: {iris.target_names}")
print(f"数据集形状: {X.shape}")
print(f"目标形状: {y.shape}")

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

模型训练和评估 ​

python
# 创建逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")

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

# 查看混淆矩阵
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))
# 创建逻辑回归模型
model = LogisticRegression()

# 训练模型
model.fit(X_train, y_train)

# 预测测试集
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")

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

# 查看混淆矩阵
print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))

入门示例3:聚类问题(K-means聚类) ​

K-means是一种常用的无监督学习算法,用于将数据分为K个簇。

数据准备 ​

python
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 生成模拟数据
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 可视化数据
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.title('模拟聚类数据')
plt.show()
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 生成模拟数据
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 可视化数据
plt.scatter(X[:, 0], X[:, 1], s=50)
plt.title('模拟聚类数据')
plt.show()

模型训练和评估 ​

python
# 创建K-means模型
kmeans = KMeans(n_clusters=4, random_state=0)

# 训练模型
kmeans.fit(X)

# 预测簇标签
y_kmeans = kmeans.predict(X)

# 计算轮廓系数
silhouette_avg = silhouette_score(X, y_kmeans)
print(f"轮廓系数: {silhouette_avg}")

# 可视化聚类结果
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.title('K-means聚类结果')
plt.show()
# 创建K-means模型
kmeans = KMeans(n_clusters=4, random_state=0)

# 训练模型
kmeans.fit(X)

# 预测簇标签
y_kmeans = kmeans.predict(X)

# 计算轮廓系数
silhouette_avg = silhouette_score(X, y_kmeans)
print(f"轮廓系数: {silhouette_avg}")

# 可视化聚类结果
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.title('K-means聚类结果')
plt.show()

模型评估和优化 ​

1. 模型评估指标 ​

回归任务 ​

  • 均方误差 (MSE):预测值与真实值之差的平方的平均值
  • 均方根误差 (RMSE):MSE的平方根,与原始数据单位相同
  • 平均绝对误差 (MAE):预测值与真实值之差的绝对值的平均值
  • 决定系数 (R²):衡量模型对数据的拟合程度,取值范围0-1

分类任务 ​

  • 准确率:正确分类的样本数占总样本数的比例
  • 精确率:预测为正类的样本中真正正类的比例
  • 召回率:真正正类的样本中被正确预测为正类的比例
  • F1值:精确率和召回率的调和平均值
  • 混淆矩阵:展示模型预测结果与真实结果的对比
  • ROC曲线和AUC值:衡量模型的分类能力

聚类任务 ​

  • 轮廓系数:衡量簇内相似度和簇间相似度的综合指标
  • Davies-Bouldin指数:衡量簇间相似度与簇内相似度的比值
  • Calinski-Harabasz指数:衡量簇内方差与簇间方差的比值

2. 模型优化 ​

超参数调优 ​

  • 网格搜索 (Grid Search):遍历所有可能的参数组合,找到最佳参数
  • 随机搜索 (Random Search):随机采样参数组合,找到最佳参数
  • 贝叶斯优化:基于贝叶斯定理,逐步调整参数,找到最佳参数
python
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10, 100],
    'solver': ['liblinear', 'lbfgs']
}

# 创建网格搜索对象
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)

# 执行网格搜索
grid_search.fit(X_train, y_train)

# 查看最佳参数和最佳分数
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳分数: {grid_search.best_score_}")
from sklearn.model_selection import GridSearchCV

# 定义参数网格
param_grid = {
    'C': [0.1, 1, 10, 100],
    'solver': ['liblinear', 'lbfgs']
}

# 创建网格搜索对象
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)

# 执行网格搜索
grid_search.fit(X_train, y_train)

# 查看最佳参数和最佳分数
print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳分数: {grid_search.best_score_}")

交叉验证 ​

  • K折交叉验证:将数据集分为K个折叠,轮流使用其中K-1个折叠作为训练集,1个折叠作为验证集
  • 分层K折交叉验证:保持各折叠中类别分布与原始数据一致
python
from sklearn.model_selection import cross_val_score

# 执行5折交叉验证
scores = cross_val_score(LogisticRegression(), X, y, cv=5)
print(f"交叉验证分数: {scores}")
print(f"平均交叉验证分数: {scores.mean()}")
from sklearn.model_selection import cross_val_score

# 执行5折交叉验证
scores = cross_val_score(LogisticRegression(), X, y, cv=5)
print(f"交叉验证分数: {scores}")
print(f"平均交叉验证分数: {scores.mean()}")

机器学习的最佳实践 ​

  1. 理解问题:明确问题类型(回归、分类、聚类等)和业务目标
  2. 数据质量:确保数据质量,处理缺失值、异常值和重复值
  3. 特征工程:选择和构建有用的特征,避免维度灾难
  4. 模型选择:根据问题类型和数据特点选择合适的模型
  5. 模型评估:使用合适的评估指标,避免过拟合和欠拟合
  6. 模型优化:调整模型参数,提高模型性能
  7. 模型部署:将模型部署到生产环境,并监控模型性能
  8. 持续学习:定期更新模型,适应新的数据分布

机器学习的常见挑战 ​

  1. 过拟合:模型在训练集上表现良好,但在测试集上表现不佳

    • 解决方法:增加训练数据、正则化、特征选择、减少模型复杂度
  2. 欠拟合:模型在训练集和测试集上表现都不佳

    • 解决方法:增加模型复杂度、添加更多特征、减少正则化
  3. 数据不平衡:不同类别的样本数量差异很大

    • 解决方法:过采样、欠采样、SMOTE算法、调整分类阈值
  4. 维度灾难:特征数量过多,导致模型复杂度增加

    • 解决方法:特征选择、降维(PCA、t-SNE)
  5. 计算资源限制:训练复杂模型需要大量的计算资源

    • 解决方法:使用更高效的算法、分布式训练、模型压缩

深度学习入门 ​

什么是深度学习 ​

深度学习是机器学习的一个分支,它使用多层神经网络来学习数据中的复杂模式。深度学习在图像识别、语音识别、自然语言处理等领域取得了突破性的进展。

使用Keras构建简单的神经网络 ​

python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

# 创建神经网络模型
model = Sequential([
    Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
    Dense(32, activation='relu'),
    Dense(4, activation='softmax')  # 4个输出类别
])

# 编译模型
model.compile(
    optimizer=Adam(learning_rate=0.001),
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# 查看模型结构
model.summary()

# 训练模型
history = model.fit(
    X_train, y_train,
    epochs=50,
    batch_size=32,
    validation_split=0.2,
    verbose=1
)

# 评估模型
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f"测试集损失: {loss}")
print(f"测试集准确率: {accuracy}")

# 可视化训练过程
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('模型准确率')
plt.xlabel(' epoch')
plt.ylabel('准确率')
plt.legend()
plt.show()

plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('模型损失')
plt.xlabel('epoch')
plt.ylabel('损失')
plt.legend()
plt.show()
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam

# 创建神经网络模型
model = Sequential([
    Dense(64, activation='relu', input_shape=(X_train.shape[1],)),
    Dense(32, activation='relu'),
    Dense(4, activation='softmax')  # 4个输出类别
])

# 编译模型
model.compile(
    optimizer=Adam(learning_rate=0.001),
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# 查看模型结构
model.summary()

# 训练模型
history = model.fit(
    X_train, y_train,
    epochs=50,
    batch_size=32,
    validation_split=0.2,
    verbose=1
)

# 评估模型
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print(f"测试集损失: {loss}")
print(f"测试集准确率: {accuracy}")

# 可视化训练过程
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('模型准确率')
plt.xlabel(' epoch')
plt.ylabel('准确率')
plt.legend()
plt.show()

plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('模型损失')
plt.xlabel('epoch')
plt.ylabel('损失')
plt.legend()
plt.show()

总结 ​

Python提供了丰富的机器学习库和框架,使得机器学习变得更加容易和高效。通过学习基本概念、常用算法和最佳实践,我们可以使用Python构建各种机器学习模型,解决实际问题。

机器学习是一个不断发展的领域,新的算法和技术不断涌现。作为初学者,我们应该从基础开始,逐步学习和实践,掌握机器学习的核心概念和技能。

推荐的学习资源:

  1. 《Python机器学习基础教程》
  2. 《深度学习入门》
  3. Scikit-learn官方文档
  4. TensorFlow和PyTorch官方文档
  5. Kaggle竞赛平台(实践机器学习技能)

通过不断学习和实践,我们可以逐步掌握机器学习的精髓,构建出高性能的机器学习模型,解决各种复杂的问题。