01机器学习中的一些基本概念(重点)
机器学习基础概念详解:特征、样本与标签
核心概念定义
1. 特征(Features)
定义:描述数据属性的变量,是模型学习的输入变量(X)
特点:
- 可以是数值型、类别型或文本型
- 特征质量直接影响模型性能
- 需要进行特征工程处理(归一化、编码等)
示例:
# 房价预测的特征示例
features = {'area': 120, # 面积(平方米)- 数值型'rooms': 3, # 房间数 - 数值型 'location': '海淀区', # 地理位置 - 类别型'built_year': 2010 # 建造年份 - 数值型
}
2. 样本(Sample/Instance)
定义:数据集中的独立个体,由一组特征值组成
特点:
- 在数据集中通常以行的形式存储
- 每个样本代表一个完整的观察对象
- 样本数量决定数据集规模
示例:
# 两个样本的数据表示
samples = [# 样本1:120㎡, 3室, 海淀区, 2010年建[120, 3, '海淀区', 2010],# 样本2:80㎡, 2室, 朝阳区, 2015年建 [80, 2, '朝阳区', 2015]
]
3. 标签(Label/Target)
定义:监督学习中的目标变量,是模型需要预测的正确答案(Y)
特点:
- 仅存在于监督学习中
- 可以是连续值(回归)或离散类别(分类)
- 标签质量直接影响模型学习效果
示例:
# 对应上述样本的标签(房价)
labels = [6500000, 4800000] # 单位:元
数据关系结构
数据表格表示
| 样本 | 特征1(面积) | 特征2(房间数) | 特征3(位置) | 标签(房价) |
|---|---|---|---|---|
| 样本1 | 120㎡ | 3室 | 海淀区 | 650万元 |
| 样本2 | 80㎡ | 2室 | 朝阳区 | 480万元 |
| 样本3 | 150㎡ | 4室 | 西城区 | 820万元 |
数学表示
对于有 n 个样本、m 个特征的数据集:
特征矩阵 X:
X = [[x₁₁, x₁₂, ..., x₁ₘ], # 样本1的特征[x₂₁, x₂₂, ..., x₂ₘ], # 样本2的特征 ...[xₙ₁, xₙ₂, ..., xₙₘ]] # 样本n的特征
标签向量 y:
y = [y₁, y₂, ..., yₙ] # 对应每个样本的标签
不同学习类型的差异
监督学习
特点:特征 + 标签
# 监督学习数据格式
X_train = [[特征1, 特征2, ...], ...] # 训练特征
y_train = [标签1, 标签2, ...] # 训练标签
应用场景:
- 分类:垃圾邮件检测、图像识别
- 回归:房价预测、销量预测
无监督学习
特点:只有特征,没有标签
# 无监督学习数据格式
X = [[特征1, 特征2, ...], ...] # 只有特征数据
应用场景:
- 聚类:客户分群、异常检测
- 降维:数据可视化、特征提取
实际应用示例
示例1:房价预测(结构化数据)
import pandas as pd
from sklearn.model_selection import train_test_split# 创建数据集
data = {'area': [120, 80, 150, 90, 200], # 特征:面积'rooms': [3, 2, 4, 2, 5], # 特征:房间数'location_encoded': [1, 2, 3, 2, 1], # 特征:地理位置编码'price': [650, 480, 820, 520, 950] # 标签:房价(万元)
}df = pd.DataFrame(data)# 划分特征和标签
X = df[['area', 'rooms', 'location_encoded']] # 特征矩阵
y = df['price'] # 标签向量print("特征矩阵形状:", X.shape) # (5, 3)
print("标签向量形状:", y.shape) # (5,)
示例2:图像分类(非结构化数据)
from tensorflow.keras.datasets import mnist
import numpy as np# 加载MNIST手写数字数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()print("训练集特征形状:", X_train.shape) # (60000, 28, 28) - 60000个28x28图像
print("训练集标签形状:", y_train.shape) # (60000,) - 60000个数字标签
print("测试集特征形状:", X_test.shape) # (10000, 28, 28)
print("测试集标签形状:", y_test.shape) # (10000,)# 查看单个样本
sample_image = X_train[0] # 特征:28x28像素矩阵
sample_label = y_train[0] # 标签:数字类别(0-9)
示例3:客户分群(无监督学习)
import pandas as pd
from sklearn.cluster import KMeans# 客户数据(只有特征,无标签)
customer_data = {'age': [25, 35, 45, 30, 40, 28, 50],'annual_income': [30, 45, 60, 35, 55, 32, 70], # 年收入(万)'spending_score': [85, 40, 25, 75, 35, 90, 15] # 消费评分
}df = pd.DataFrame(customer_data)
X = df[['age', 'annual_income', 'spending_score']] # 只有特征# 使用K-means聚类(无监督学习)
kmeans = KMeans(n_clusters=3)
clusters = kmeans.fit_predict(X)print("聚类结果:", clusters) # 自动发现的客户分组
数据划分策略
训练集/测试集划分
from sklearn.model_selection import train_test_split# 常见划分比例
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, # 测试集占20%random_state=42 # 随机种子,确保可重复性
)print(f"训练集: {X_train.shape[0]} 个样本")
print(f"测试集: {X_test.shape[0]} 个样本")
推荐划分比例
| 数据规模 | 训练集 | 测试集 | 验证集 |
|---|---|---|---|
| 小数据 (<1000样本) | 70% | 30% | - |
| 中数据 (1000-10000) | 80% | 20% | - |
| 大数据 (>10000) | 70% | 15% | 15% |
特征工程重要性
特征处理示例
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.impute import SimpleImputer# 1. 处理缺失值
imputer = SimpleImputer(strategy='mean')
X_imputed = imputer.fit_transform(X)# 2. 类别特征编码
encoder = LabelEncoder()
X_encoded = encoder.fit_transform(categorical_features)# 3. 数值特征标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_imputed)print("原始特征形状:", X.shape)
print("处理后的特征形状:", X_scaled.shape)
常见误区澄清
❌ 错误理解
- “特征和标签可以随意选择”
- “样本越多越好,不需要质量”
- “所有特征都对预测有用”
- “无监督学习不需要标签,所以更简单”
✅ 正确理解
- 特征选择:需要领域知识和数据分析
- 数据质量:质量比数量更重要
- 特征相关性:需要特征选择和降维
- 无监督学习:虽然不需要标签,但评估更复杂
总结要点
- 特征(X):模型的输入,描述数据属性
- 样本:数据的基本单位,由特征组成
- 标签(y):监督学习的目标输出
- 数据划分:训练集用于学习,测试集用于评估
- 特征工程:数据预处理对模型性能至关重要
