机器学习实战:从基础到深度学习
Machine Learning Basics & Workflow Machine learning enables computers to improve performance through data experience. Key steps include: Data Collection: Sourcing from databases/APIs. Preprocessin
·
以下是针对机器学习基础与流程的详细解析,结合代码示例进行分步讲解,帮助用户理解每个环节的核心概念和实现方法。
一、机器学习基础与流程
1. 机器学习定义
核心概念:
机器学习通过数据自动优化模型性能,无需显式编程。例如:
- 输入:历史房价数据(面积、地段等特征)。
- 输出:预测新房屋的价格。
关键点:
- 模型从数据中学习规律(如面积越大,价格越高)。
- 性能通过新数据验证(避免“死记硬背”)。
2. 典型流程
(1) 数据收集
- 来源:数据库(如MySQL)、API(如Twitter数据)、爬虫(如BeautifulSoup)。
- 示例:从Kaggle下载房价数据集(
house_prices.csv)。
(2) 数据预处理
步骤:
- 清洗缺失值:删除或填充空值(如用均值填充)。
- 标准化:将特征缩放到同一范围(如0~1),避免某些特征主导模型。
- 特征编码:将分类变量(如颜色“红/绿”)转为数值(如0/1)。
代码解析(标准化示例):
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# 原始数据:房屋面积和价格
data = np.array([[10, 200], [15, 300], [20, 400]])
scaler = MinMaxScaler(feature_range=(0, 1)) # 定义缩放范围
normalized_data = scaler.fit_transform(data) # 计算并应用缩放
print("标准化后数据:\n", normalized_data)
- 输出:面积和价格均被缩放到0~1之间,公平比较。
(3) 模型训练
- 选择算法:根据任务选模型(如预测房价用线性回归)。
- 拟合数据:将数据输入模型,调整内部参数。
(4) 评估与优化
- 评估指标:
- 回归问题:均方误差(MSE),越小越好。
- 分类问题:准确率(Accuracy),越高越好。
- 调参:调整学习率、树深度等超参数(如
GridSearchCV)。
(5) 部署应用
- 方式:将模型保存为文件(如
.pkl),通过API提供预测服务。
二、监督学习算法详解
1. 线性回归
适用场景:预测连续值(如销售额、温度)。
原理:找到一条直线(或超平面),使预测值与真实值的误差平方和最小。
代码解析:
from sklearn.linear_model import LinearRegression
import numpy as np
# 生成模拟数据:房屋面积(X)和价格(y)
X = np.random.rand(100, 1) * 10
y = 2.5 * X + np.random.randn(100, 1) * 2 # 真实关系:y=2.5X+噪声
# 训练模型
model = LinearRegression()
model.fit(X, y) # 内部计算斜率和截距
# 预测新数据
new_X = np.array([[5]]) # 50平米的房子
predicted_price = model.predict(new_X)
print(f"预测价格: {predicted_price[0][0]:.2f}")
- 输出:模型学习到斜率≈2.5,截距≈0,与生成数据的规则一致。
2. 逻辑回归
适用场景:二分类问题(如垃圾邮件检测)。
关键点:
- 输出概率(0~1),通过阈值(如0.5)决定类别。
- 虽名含“回归”,实为分类模型。
代码解析:
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
# 使用鸢尾花数据集(仅两类:0和1)
data = load_iris()
X = data.data[:100, :2] # 只用前两个特征
y = (data.target[:100] == 0).astype(int) # 标签:是否为类别0
model = LogisticRegression()
model.fit(X, y) # 学习分类边界
# 预测新样本
new_sample = [[5.0, 3.6]] # 花萼长5.0,宽3.6
prob = model.predict_proba(new_sample)[0][1] # 属于类别1的概率
print(f"属于类别1的概率: {prob:.2f}")
- 输出:模型输出概率,如0.85表示有85%概率为类别1。
3. 决策树与随机森林
决策树:通过一系列“是/否”问题分割数据(如“面积>100?”)。
随机森林:多棵决策树投票,减少过拟合。
代码解析(随机森林):
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
data = load_iris()
X, y = data.data, data.target
model = RandomForestClassifier(n_estimators=100) # 100棵树
model.fit(X, y) # 每棵树独立学习数据子集
# 特征重要性:哪些特征对分类最关键
importances = model.feature_importances_
print("特征重要性:", importances)
- 输出:如花瓣长度的重要性最高,说明它对区分鸢尾花类别最有用。
三、无监督学习算法详解
1. K-Means聚类
目标:将数据分成K个簇,簇内相似度高,簇间差异大。
步骤:
- 随机选K个点作为初始中心。
- 将每个点分配到最近的中心。
- 重新计算中心点(簇内均值)。
- 重复2-3步直到收敛。
代码解析:
from sklearn.cluster import KMeans
import numpy as np
# 生成二维随机数据
X = np.random.rand(100, 2) * 10
kmeans = KMeans(n_clusters=3) # 分成3类
kmeans.fit(X) # 执行聚类
print("簇中心坐标:\n", kmeans.cluster_centers_)
- 输出:3个簇中心的坐标,如
[[2.1, 3.5], [7.2, 1.8], ...]。
2. PCA降维
用途:减少特征数量,保留主要信息(如从1000维降到10维)。
原理:找到数据方差最大的方向作为新坐标轴。
代码解析:
from sklearn.decomposition import PCA
import numpy as np
# 生成10维数据(100个样本)
X = np.random.rand(100, 10)
pca = PCA(n_components=2) # 降到2维
X_reduced = pca.fit_transform(X) # 转换数据
print("降维后形状:", X_reduced.shape) # 输出(100, 2)
- 输出:数据从10维压缩到2维,便于可视化或加速计算。
四、深度学习基础
1. 神经网络与反向传播
结构:
- 输入层 → 隐藏层(激活函数如ReLU) → 输出层。
- 反向传播:根据误差调整权重(链式法则求导)。
代码解析(PyTorch示例):
import torch
import torch.nn as nn
class SimpleNN(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 5) # 输入10维,隐藏层5维
self.fc2 = nn.Linear(5, 1) # 输出1维
def forward(self, x):
x = torch.relu(self.fc1(x)) # 隐藏层激活
x = self.fc2(x)
return x
# 生成数据并训练(同前述代码)
- 关键点:
relu引入非线性,使网络能拟合复杂函数。
2. CNN与图像分类
卷积层:用滑动窗口(如3x3)提取局部特征(如边缘、纹理)。
池化层:降采样(如2x2最大池化),减少计算量。
代码解析(MNIST分类):
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3) # 输入1通道(灰度图),输出32通道
self.pool = nn.MaxPool2d(2, 2) # 2x2池化
self.fc1 = nn.Linear(32 * 13 * 13, 10) # 全连接层输出10类
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x))) # 卷积+激活+池化
x = x.view(-1, 32 * 13 * 13) # 展平为向量
x = self.fc1(x)
return x
- 输出:模型能识别手写数字(如输入28x28图像,输出0-9的概率分布)。
总结
- 监督学习:有标签数据(如分类、回归)。
- 无监督学习:无标签数据(如聚类、降维)。
- 深度学习:通过神经网络自动提取特征,适合复杂任务(如图像、文本)。
通过分步解析和代码示例,用户可以逐步掌握机器学习的核心流程和实现细节。
更多推荐
所有评论(0)