机器学习 1 — 入门
:::tip Kaggle 笔记本 本章的完整可执行代码在 Kaggle 上:打开 →
法语和英语版本可在首页查看。 :::
课程的第一章。我们重新回顾整个学习过程中将要使用的 Python 工具,最后介绍面向对象编程——这是一个重要的预备,因为下一章我们将手动编写线性回归,并将其封装为一个类。
为什么要学这一章?
在机器学习中,我们花费80% 的时间处理数据,20% 训练模型。本章为您提供数据处理的基本工具:
- NumPy 用于数值计算(向量、矩阵、向量化运算);
- pandas 用于读取 CSV 文件和表格操作;
- Seaborn 和 Plotly 用于可视化;
- Python 类用于组织模型。
NumPy:向量化的数值计算
NumPy 数组相当于 Python 列表,但由于使用了优化的 C 代码,进行数值计算时速度快得多。
import numpy as np
x = np.array([1, 2, 3, 4]) # 1D 向量,shape (4,)
X = np.array([[1, 2], [3, 4]]) # 2D 矩阵,shape (2, 2)
.shape 属性给出维度。这是处理数组时首先要查看的内容。
向量化运算
NumPy 逐元素应用运算,无需 Python 循环:
x + 1 # 每个元素加 1
x * 2 # 每个元素乘以 2
x ** 2 # 每个元素平方
np.sum(x), np.mean(x), np.std(x)
代码更短,速度比 for 循环快得多。
矩阵乘积和 @ 运算符
矩阵乘法——在机器学习中无处不在——使用 @ 运算符:
X = np.array([[1, 2], [3, 4], [5, 6]]) # (3, 2)
w = np.array([0.5, 1.0]) # (2,)
X @ w # (3,) — 矩阵乘积
:::warning 经典陷阱
X * w 执行逐元素乘法(带广播),而不是矩阵乘法。当您表示 时,请始终使用 @。
:::
pandas:表格操作
pandas 是数据文件(CSV、Excel)和 Python 代码之间的桥梁。核心结构是 DataFrame,相当于 Excel 表格在代码中的等价物。
import pandas as pd
df = pd.read_csv('data.csv')
df.head() # 前几行
df.shape # (行数, 列数)
df.info() # 类型、缺失值、内存
df.describe() # 每列的最小值、最大值、平均值、标准差
选择列
df['co2'] # 一列 → Series(1D)
df[['co2']] # 同一列,但作为 DataFrame(2D)
df[['consumption', 'co2']] # 多列
Series vs DataFrame 的区别很重要:scikit-learn 通常对解释变量期望 2D,因此您经常会看到 [[...]]。
快速统计
df['co2'].mean() # 或 np.mean(df['co2'])
df['co2'].std() # 标准差
df['co2'].min(), df['co2'].max()
df['co2'].describe() # 一次性获取所有统计
可视化:Seaborn 和 Plotly
两个互补的库:
- Seaborn:一行代码即可绘制统计图表(boxplot、scatter、KDE),面向 DataFrame 的语法,输出静态图像。
- Plotly Express:交互式图表(缩放、悬停、平移),非常适合探索数据。
import seaborn as sns
import plotly.express as px
sns.boxplot(y=df['co2']) # 静态
px.scatter(df, x='consumption', y='co2', trendline='ols') # 交互式
箱线图(boxplot)用五个数字总结分布:最小值、(25%)、中位数、(75%)、最大值。盒子从 延伸到 —— 四分位距 包含 50% 的数值。孤立的点是离群值(超出 或 )。
Python 类——面向对象编程
在本章结束之前,我们回顾面向对象编程。为什么?因为在下一章,我们将把线性神经元写成一个带有 fit、predict、history 的类——就像 scikit-learn 一样。
class Calculator:
def __init__(self):
self.memory = 10 # 实例属性
def add(self, x):
self.memory = self.memory + x # 修改状态的方法
calc = Calculator()
calc.add(5)
print(calc.memory) # 15
需要记住的三件事:
__init__是构造函数,在创建对象时自动调用。self表示当前实例。始终是方法的第一个参数。- 属性(
self.memory)在调用之间保留对象的状态。
这种结构将成为我们将要编写的所有模型的标准模式:__init__ 用于初始化,fit 用于学习,predict 用于预测。