以下是针对机器学习基础与流程的详细解析,结合代码示例进行分步讲解,帮助用户理解每个环节的核心概念和实现方法。


一、机器学习基础与流程

1. 机器学习定义

核心概念
机器学习通过数据自动优化模型性能,无需显式编程。例如:

  • 输入:历史房价数据(面积、地段等特征)。
  • 输出:预测新房屋的价格。

关键点

  • 模型从数据中学习规律(如面积越大,价格越高)。
  • 性能通过新数据验证(避免“死记硬背”)。

2. 典型流程
(1) 数据收集
  • 来源:数据库(如MySQL)、API(如Twitter数据)、爬虫(如BeautifulSoup)。
  • 示例:从Kaggle下载房价数据集(house_prices.csv)。
(2) 数据预处理

步骤

  1. 清洗缺失值:删除或填充空值(如用均值填充)。
  2. 标准化:将特征缩放到同一范围(如0~1),避免某些特征主导模型。
  3. 特征编码:将分类变量(如颜色“红/绿”)转为数值(如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个簇,簇内相似度高,簇间差异大。
步骤

  1. 随机选K个点作为初始中心。
  2. 将每个点分配到最近的中心。
  3. 重新计算中心点(簇内均值)。
  4. 重复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的概率分布)。

总结

  • 监督学习:有标签数据(如分类、回归)。
  • 无监督学习:无标签数据(如聚类、降维)。
  • 深度学习:通过神经网络自动提取特征,适合复杂任务(如图像、文本)。

通过分步解析和代码示例,用户可以逐步掌握机器学习的核心流程和实现细节。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐