Python机器学习入门
机器学习的基本概念
什么是机器学习
机器学习是人工智能的一个分支,它使计算机能够从数据中学习并做出预测或决策,而无需明确编程。机器学习的核心是算法,这些算法可以从数据中自动学习模式和规律。
机器学习的类型
1. 监督学习
- 从标记数据中学习(即每个样本都有对应的标签或结果)
- 目标是学习一个函数,能够将输入映射到输出
- 常见算法:线性回归、逻辑回归、决策树、随机森林、支持向量机、神经网络等
- 应用场景:预测房价、图像分类、语音识别等
2. 无监督学习
- 从未标记数据中学习(即样本没有对应的标签或结果)
- 目标是发现数据中的模式和结构
- 常见算法:聚类(K-means、层次聚类)、降维(PCA、t-SNE)、关联规则学习等
- 应用场景:客户分群、异常检测、数据可视化等
3. 半监督学习
- 结合标记数据和未标记数据进行学习
- 标记数据通常较少,未标记数据较多
- 应用场景:图像分类、文本分类等
4. 强化学习
- 智能体通过与环境交互学习最优策略
- 智能体执行动作,环境反馈奖励或惩罚
- 常见算法:Q-learning、深度Q网络(DQN)、策略梯度等
- 应用场景:游戏AI、机器人控制、自动驾驶等
机器学习的工作流程
- 数据收集:获取相关的数据集
- 数据预处理:清洗数据、处理缺失值、特征缩放等
- 特征工程:选择、提取和构建有用的特征
- 模型选择:选择合适的机器学习算法
- 模型训练:使用训练数据训练模型
- 模型评估:使用测试数据评估模型性能
- 模型优化:调整模型参数,提高模型性能
- 模型部署:将模型部署到生产环境
常用的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()}")机器学习的最佳实践
- 理解问题:明确问题类型(回归、分类、聚类等)和业务目标
- 数据质量:确保数据质量,处理缺失值、异常值和重复值
- 特征工程:选择和构建有用的特征,避免维度灾难
- 模型选择:根据问题类型和数据特点选择合适的模型
- 模型评估:使用合适的评估指标,避免过拟合和欠拟合
- 模型优化:调整模型参数,提高模型性能
- 模型部署:将模型部署到生产环境,并监控模型性能
- 持续学习:定期更新模型,适应新的数据分布
机器学习的常见挑战
过拟合:模型在训练集上表现良好,但在测试集上表现不佳
- 解决方法:增加训练数据、正则化、特征选择、减少模型复杂度
欠拟合:模型在训练集和测试集上表现都不佳
- 解决方法:增加模型复杂度、添加更多特征、减少正则化
数据不平衡:不同类别的样本数量差异很大
- 解决方法:过采样、欠采样、SMOTE算法、调整分类阈值
维度灾难:特征数量过多,导致模型复杂度增加
- 解决方法:特征选择、降维(PCA、t-SNE)
计算资源限制:训练复杂模型需要大量的计算资源
- 解决方法:使用更高效的算法、分布式训练、模型压缩
深度学习入门
什么是深度学习
深度学习是机器学习的一个分支,它使用多层神经网络来学习数据中的复杂模式。深度学习在图像识别、语音识别、自然语言处理等领域取得了突破性的进展。
使用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构建各种机器学习模型,解决实际问题。
机器学习是一个不断发展的领域,新的算法和技术不断涌现。作为初学者,我们应该从基础开始,逐步学习和实践,掌握机器学习的核心概念和技能。
推荐的学习资源:
- 《Python机器学习基础教程》
- 《深度学习入门》
- Scikit-learn官方文档
- TensorFlow和PyTorch官方文档
- Kaggle竞赛平台(实践机器学习技能)
通过不断学习和实践,我们可以逐步掌握机器学习的精髓,构建出高性能的机器学习模型,解决各种复杂的问题。
Cao Note