1.1 什么是机器学习
机器学习(Machine Learning, ML)是人工智能的一个分支,它使计算机能够在没有明确编程的情况下学习和改进。机器学习算法通过分析数据来识别模式,并使用这些模式对新数据进行预测或决策。
1.1.1 机器学习的定义
传统定义:机器学习是一种让计算机系统能够自动学习并改进性能的方法,而无需明确编程。
现代定义:机器学习是一种数据驱动的方法,通过算法从数据中学习模式,并使用这些模式对未见过的数据进行预测或分类。
1.1.2 机器学习 vs 传统编程
传统编程 | 机器学习 |
---|---|
程序员编写规则 | 算法从数据中学习规则 |
输入数据 + 程序 = 输出 | 输入数据 + 输出 = 程序 |
逻辑明确 | 模式发现 |
适用于规则明确的问题 | 适用于复杂模式识别 |
1.1.3 机器学习的应用领域
- 计算机视觉:图像识别、人脸识别、医学影像分析
- 自然语言处理:机器翻译、情感分析、聊天机器人
- 推荐系统:电商推荐、内容推荐、广告投放
- 金融科技:风险评估、欺诈检测、算法交易
- 医疗健康:疾病诊断、药物发现、个性化治疗
- 自动驾驶:路径规划、障碍物检测、决策系统
1.2 机器学习的类型
1.2.1 监督学习(Supervised Learning)
监督学习使用标记的训练数据来学习输入和输出之间的映射关系。
特点: - 有标记的训练数据 - 目标是学习输入到输出的映射 - 可以评估模型性能
主要任务:
分类(Classification)
预测离散的类别标签。
示例: - 邮件垃圾分类(垃圾邮件 vs 正常邮件) - 图像分类(猫 vs 狗) - 疾病诊断(患病 vs 健康)
常用算法: - 逻辑回归(Logistic Regression) - 决策树(Decision Tree) - 随机森林(Random Forest) - 支持向量机(SVM) - 神经网络(Neural Networks)
回归(Regression)
预测连续的数值。
示例: - 房价预测 - 股票价格预测 - 销售额预测
常用算法: - 线性回归(Linear Regression) - 多项式回归(Polynomial Regression) - 岭回归(Ridge Regression) - 支持向量回归(SVR)
1.2.2 无监督学习(Unsupervised Learning)
无监督学习从无标记的数据中发现隐藏的模式和结构。
特点: - 无标记的训练数据 - 目标是发现数据中的模式 - 难以直接评估性能
主要任务:
聚类(Clustering)
将相似的数据点分组。
示例: - 客户细分 - 基因序列分析 - 图像分割
常用算法: - K-Means - 层次聚类(Hierarchical Clustering) - DBSCAN - 高斯混合模型(GMM)
降维(Dimensionality Reduction)
减少数据的特征数量,保留重要信息。
示例: - 数据可视化 - 特征选择 - 噪声去除
常用算法: - 主成分分析(PCA) - t-SNE - 线性判别分析(LDA)
关联规则学习(Association Rule Learning)
发现数据项之间的关联关系。
示例: - 购物篮分析 - 网页点击模式 - 基因关联分析
常用算法: - Apriori算法 - FP-Growth算法
1.2.3 强化学习(Reinforcement Learning)
强化学习通过与环境交互来学习最优行为策略。
特点: - 通过试错学习 - 有奖励信号 - 目标是最大化累积奖励
主要组件: - 智能体(Agent):学习者或决策者 - 环境(Environment):智能体交互的世界 - 状态(State):环境的当前情况 - 动作(Action):智能体可以执行的操作 - 奖励(Reward):环境给予的反馈
应用示例: - 游戏AI(AlphaGo、Dota 2) - 自动驾驶 - 机器人控制 - 推荐系统优化
常用算法: - Q-Learning - Deep Q-Network (DQN) - Policy Gradient - Actor-Critic
1.2.4 半监督学习(Semi-supervised Learning)
半监督学习结合了少量标记数据和大量无标记数据。
特点: - 部分数据有标记 - 利用无标记数据改进性能 - 适用于标记成本高的场景
应用场景: - 文本分类(少量标记文档) - 图像识别(少量标记图片) - 语音识别
1.3 机器学习的工作流程
1.3.1 典型的机器学习项目流程
1. 问题定义 → 2. 数据收集 → 3. 数据预处理 → 4. 特征工程 →
5. 模型选择 → 6. 模型训练 → 7. 模型评估 → 8. 模型优化 →
9. 模型部署 → 10. 监控维护
1.3.2 详细步骤说明
1. 问题定义
- 明确业务目标
- 确定问题类型(分类、回归、聚类等)
- 定义成功指标
- 评估可行性
2. 数据收集
- 确定数据源
- 收集相关数据
- 评估数据质量
- 考虑数据隐私和合规性
3. 数据预处理
- 数据清洗(处理缺失值、异常值)
- 数据格式统一
- 数据类型转换
- 数据集成
4. 特征工程
- 特征选择
- 特征创建
- 特征变换
- 特征缩放
5. 模型选择
- 选择合适的算法
- 考虑数据特点
- 平衡性能和复杂度
- 设置基线模型
6. 模型训练
- 划分训练集和测试集
- 训练模型
- 调整超参数
- 交叉验证
7. 模型评估
- 选择评估指标
- 在测试集上评估
- 分析模型性能
- 识别改进空间
8. 模型优化
- 超参数调优
- 特征工程优化
- 模型集成
- 算法改进
9. 模型部署
- 选择部署平台
- 模型打包
- API开发
- 性能监控
10. 监控维护
- 性能监控
- 数据漂移检测
- 模型更新
- 持续改进
1.4 机器学习的核心概念
1.4.1 训练集、验证集和测试集
训练集(Training Set)
- 用途:训练模型参数
- 比例:通常占总数据的60-80%
- 特点:模型直接学习的数据
验证集(Validation Set)
- 用途:调整超参数,选择模型
- 比例:通常占总数据的10-20%
- 特点:用于模型选择,不参与训练
测试集(Test Set)
- 用途:评估最终模型性能
- 比例:通常占总数据的10-20%
- 特点:模型从未见过的数据,用于最终评估
# 数据集划分示例
from sklearn.model_selection import train_test_split
# 首先分离出测试集
X_temp, X_test, y_temp, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 再从剩余数据中分离训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(
X_temp, y_temp, test_size=0.25, random_state=42 # 0.25 * 0.8 = 0.2
)
print(f"训练集大小: {len(X_train)}")
print(f"验证集大小: {len(X_val)}")
print(f"测试集大小: {len(X_test)}")
1.4.2 过拟合和欠拟合
过拟合(Overfitting)
模型在训练数据上表现很好,但在新数据上表现较差。
特征: - 训练误差很小 - 验证误差较大 - 训练误差和验证误差差距很大
原因: - 模型过于复杂 - 训练数据不足 - 训练时间过长
解决方法: - 增加训练数据 - 简化模型 - 正则化 - 早停(Early Stopping) - Dropout(神经网络)
欠拟合(Underfitting)
模型过于简单,无法捕捉数据中的模式。
特征: - 训练误差较大 - 验证误差也较大 - 训练误差和验证误差都很高
原因: - 模型过于简单 - 特征不足 - 训练不充分
解决方法: - 增加模型复杂度 - 增加特征 - 减少正则化 - 增加训练时间
偏差-方差权衡(Bias-Variance Tradeoff)
偏差(Bias): - 模型预测值与真实值的差异 - 高偏差导致欠拟合 - 简单模型通常有高偏差
方差(Variance): - 模型对训练数据变化的敏感性 - 高方差导致过拟合 - 复杂模型通常有高方差
权衡: - 降低偏差通常会增加方差 - 降低方差通常会增加偏差 - 目标是找到最佳平衡点
1.4.3 交叉验证(Cross-Validation)
交叉验证是一种评估模型性能的技术,通过多次划分数据来获得更可靠的性能估计。
K折交叉验证(K-Fold Cross-Validation)
from sklearn.model_selection import cross_val_score, KFold
from sklearn.linear_model import LogisticRegression
# 创建模型
model = LogisticRegression()
# 5折交叉验证
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold, scoring='accuracy')
print(f"交叉验证分数: {scores}")
print(f"平均分数: {scores.mean():.3f}")
print(f"标准差: {scores.std():.3f}")
分层交叉验证(Stratified Cross-Validation)
保持每折中各类别的比例与原数据集相同。
from sklearn.model_selection import StratifiedKFold
# 分层5折交叉验证
skfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skfold, scoring='accuracy')
print(f"分层交叉验证分数: {scores}")
print(f"平均分数: {scores.mean():.3f}")
留一交叉验证(Leave-One-Out Cross-Validation)
每次只留一个样本作为验证集。
from sklearn.model_selection import LeaveOneOut
# 留一交叉验证
loo = LeaveOneOut()
scores = cross_val_score(model, X, y, cv=loo, scoring='accuracy')
print(f"留一交叉验证平均分数: {scores.mean():.3f}")
1.5 机器学习的数学基础
1.5.1 线性代数基础
向量(Vector)
向量是具有大小和方向的量,在机器学习中用于表示特征。
import numpy as np
# 创建向量
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
# 向量运算
print(f"向量加法: {v1 + v2}")
print(f"向量点积: {np.dot(v1, v2)}")
print(f"向量长度: {np.linalg.norm(v1)}")
矩阵(Matrix)
矩阵用于表示数据集和模型参数。
# 创建矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵运算
print(f"矩阵乘法:\n{np.dot(A, B)}")
print(f"矩阵转置:\n{A.T}")
print(f"矩阵逆:\n{np.linalg.inv(A)}")
1.5.2 概率与统计
概率基础
- 概率:事件发生的可能性,取值范围[0, 1]
- 条件概率:P(A|B) = P(A∩B) / P(B)
- 贝叶斯定理:P(A|B) = P(B|A) × P(A) / P(B)
常用分布
import matplotlib.pyplot as plt
from scipy import stats
# 正态分布
x = np.linspace(-4, 4, 100)
y_normal = stats.norm.pdf(x, 0, 1)
# 绘制正态分布
plt.figure(figsize=(10, 6))
plt.plot(x, y_normal, label='正态分布 N(0,1)')
plt.xlabel('x')
plt.ylabel('概率密度')
plt.title('正态分布')
plt.legend()
plt.grid(True)
plt.show()
1.5.3 微积分基础
导数
导数表示函数的变化率,在机器学习中用于优化。
# 数值求导示例
def f(x):
return x**2 + 2*x + 1
def numerical_derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
# 计算导数
x = 2
derivative = numerical_derivative(f, x)
print(f"f'({x}) ≈ {derivative}")
梯度下降
梯度下降是机器学习中最重要的优化算法。
def gradient_descent(f, df, x0, learning_rate=0.01, max_iterations=1000):
"""
梯度下降算法
参数:
f: 目标函数
df: 目标函数的导数
x0: 初始点
learning_rate: 学习率
max_iterations: 最大迭代次数
"""
x = x0
history = [x]
for i in range(max_iterations):
gradient = df(x)
x = x - learning_rate * gradient
history.append(x)
# 收敛检查
if abs(gradient) < 1e-6:
break
return x, history
# 示例:最小化 f(x) = x^2
def f(x):
return x**2
def df(x):
return 2*x
# 运行梯度下降
result, history = gradient_descent(f, df, x0=5, learning_rate=0.1)
print(f"最优解: {result}")
print(f"迭代次数: {len(history)}")
1.6 Python机器学习生态系统
1.6.1 核心库介绍
NumPy
数值计算基础库,提供多维数组和数学函数。
import numpy as np
# 创建数组
arr = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2], [3, 4]])
# 数组操作
print(f"数组形状: {arr.shape}")
print(f"矩阵形状: {matrix.shape}")
print(f"数组求和: {np.sum(arr)}")
print(f"矩阵转置:\n{matrix.T}")
Pandas
数据处理和分析库,提供DataFrame数据结构。
import pandas as pd
# 创建DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'salary': [50000, 60000, 70000]
}
df = pd.DataFrame(data)
# 数据操作
print(df.head())
print(f"平均年龄: {df['age'].mean()}")
print(f"数据描述:\n{df.describe()}")
Matplotlib
数据可视化库。
import matplotlib.pyplot as plt
# 创建图表
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, label='sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('正弦函数')
plt.legend()
plt.grid(True)
plt.show()
Scikit-learn
机器学习算法库。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 预测和评估
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.3f}")
1.6.2 环境配置
使用Anaconda
# 创建虚拟环境
conda create -n ml_env python=3.8
# 激活环境
conda activate ml_env
# 安装常用包
conda install numpy pandas matplotlib scikit-learn jupyter
# 安装深度学习框架
conda install tensorflow pytorch
使用pip
# 创建虚拟环境
python -m venv ml_env
# 激活环境(Windows)
ml_env\Scripts\activate
# 激活环境(Linux/Mac)
source ml_env/bin/activate
# 安装包
pip install numpy pandas matplotlib scikit-learn jupyter
pip install tensorflow torch
1.7 第一个机器学习项目
1.7.1 项目:鸢尾花分类
我们将使用著名的鸢尾花数据集来构建第一个机器学习模型。
# 导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import seaborn as sns
# 1. 加载数据
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
feature_names = iris.feature_names
target_names = iris.target_names
print(f"数据集形状: {X.shape}")
print(f"特征名称: {feature_names}")
print(f"类别名称: {target_names}")
# 2. 数据探索
# 创建DataFrame便于分析
df = pd.DataFrame(X, columns=feature_names)
df['target'] = y
df['species'] = df['target'].map({0: 'setosa', 1: 'versicolor', 2: 'virginica'})
print("\n数据前5行:")
print(df.head())
print("\n数据统计信息:")
print(df.describe())
print("\n各类别数量:")
print(df['species'].value_counts())
# 3. 数据可视化
plt.figure(figsize=(15, 10))
# 特征分布
for i, feature in enumerate(feature_names):
plt.subplot(2, 3, i+1)
for species in target_names:
data = df[df['species'] == species][feature]
plt.hist(data, alpha=0.7, label=species, bins=20)
plt.xlabel(feature)
plt.ylabel('频率')
plt.title(f'{feature} 分布')
plt.legend()
# 特征散点图
plt.subplot(2, 3, 5)
for i, species in enumerate(target_names):
data = df[df['species'] == species]
plt.scatter(data['sepal length (cm)'], data['sepal width (cm)'],
label=species, alpha=0.7)
plt.xlabel('花萼长度 (cm)')
plt.ylabel('花萼宽度 (cm)')
plt.title('花萼长度 vs 宽度')
plt.legend()
plt.subplot(2, 3, 6)
for i, species in enumerate(target_names):
data = df[df['species'] == species]
plt.scatter(data['petal length (cm)'], data['petal width (cm)'],
label=species, alpha=0.7)
plt.xlabel('花瓣长度 (cm)')
plt.ylabel('花瓣宽度 (cm)')
plt.title('花瓣长度 vs 宽度')
plt.legend()
plt.tight_layout()
plt.show()
# 4. 数据预处理
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print(f"\n训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
# 5. 模型训练
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
# 6. 模型预测
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# 7. 模型评估
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_test_pred)
print(f"\n训练集准确率: {train_accuracy:.3f}")
print(f"测试集准确率: {test_accuracy:.3f}")
# 详细分类报告
print("\n分类报告:")
print(classification_report(y_test, y_test_pred, target_names=target_names))
# 混淆矩阵
cm = confusion_matrix(y_test, y_test_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=target_names, yticklabels=target_names)
plt.title('混淆矩阵')
plt.xlabel('预测标签')
plt.ylabel('真实标签')
plt.show()
# 8. 特征重要性
feature_importance = abs(model.coef_[0])
plt.figure(figsize=(10, 6))
plt.bar(feature_names, feature_importance)
plt.title('特征重要性')
plt.xlabel('特征')
plt.ylabel('重要性')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# 9. 预测新样本
new_sample = np.array([[5.1, 3.5, 1.4, 0.2]]) # 新的鸢尾花样本
prediction = model.predict(new_sample)
probability = model.predict_proba(new_sample)
print(f"\n新样本预测:")
print(f"特征值: {new_sample[0]}")
print(f"预测类别: {target_names[prediction[0]]}")
print(f"预测概率: {dict(zip(target_names, probability[0]))}")
1.7.2 项目总结
通过这个简单的项目,我们学习了:
- 数据加载:使用sklearn加载内置数据集
- 数据探索:查看数据形状、统计信息、类别分布
- 数据可视化:使用matplotlib和seaborn创建图表
- 数据预处理:划分训练集和测试集
- 模型训练:使用逻辑回归算法
- 模型评估:计算准确率、查看分类报告和混淆矩阵
- 结果解释:分析特征重要性
- 模型应用:对新样本进行预测
1.8 本章小结
本章介绍了机器学习的基础概念,包括:
核心概念
- 机器学习定义:让计算机从数据中学习模式的方法
- 学习类型:监督学习、无监督学习、强化学习、半监督学习
- 主要任务:分类、回归、聚类、降维、关联规则学习
重要原理
- 训练流程:从问题定义到模型部署的完整流程
- 数据划分:训练集、验证集、测试集的作用和划分方法
- 模型评估:过拟合、欠拟合、偏差-方差权衡
- 交叉验证:获得更可靠的性能评估
技术基础
- 数学基础:线性代数、概率统计、微积分
- Python生态:NumPy、Pandas、Matplotlib、Scikit-learn
- 实践项目:鸢尾花分类的完整实现
下一章预告
下一章我们将深入学习数据预处理与特征工程,包括: - 数据清洗技术 - 缺失值处理 - 异常值检测 - 特征选择和创建 - 数据标准化和归一化 - 类别变量编码
1.9 练习题
基础练习
概念理解
- 解释监督学习和无监督学习的区别
- 举例说明分类和回归问题的不同
- 什么是过拟合?如何避免?
数据集划分
# 给定1000个样本,按照6:2:2的比例划分训练集、验证集、测试集 # 请编写代码实现
交叉验证
# 使用5折交叉验证评估逻辑回归模型在鸢尾花数据集上的性能 # 计算平均准确率和标准差
进阶练习
数据探索
- 加载波士顿房价数据集
- 分析特征分布和相关性
- 创建可视化图表
模型比较
# 在鸢尾花数据集上比较以下算法的性能: # - 逻辑回归 # - 决策树 # - 随机森林 # - 支持向量机
- 特征工程
创建新特征(如花萼面积、花瓣面积)
比较添加新特征前后的模型性能
项目练习
- 完整项目 选择一个数据集(如红酒质量、泰坦尼克号乘客生存等),完成以下任务:
- 数据加载和探索
- 数据预处理
- 模型训练和评估
- 结果可视化
- 撰写项目报告
- 模型优化
使用网格搜索优化超参数
实现模型集成
分析特征重要性
思考题
- 实际应用
- 思考机器学习在你感兴趣的领域中的应用
- 设计一个机器学习解决方案
- 考虑可能遇到的挑战和解决方案
- 伦理考虑
- 讨论机器学习中的偏见问题
- 如何确保模型的公平性?
- 数据隐私保护的重要性 这些练习将帮助你巩固本章学到的知识,为后续章节的学习打下坚实基础。