机器学习基础概念详解:特征、样本与标签

核心概念定义

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(位置)标签(房价)
样本1120㎡3室海淀区650万元
样本280㎡2室朝阳区480万元
样本3150㎡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)

常见误区澄清

❌ 错误理解

  1. “特征和标签可以随意选择”
  2. “样本越多越好,不需要质量”
  3. “所有特征都对预测有用”
  4. “无监督学习不需要标签,所以更简单”

✅ 正确理解

  1. 特征选择:需要领域知识和数据分析
  2. 数据质量:质量比数量更重要
  3. 特征相关性:需要特征选择和降维
  4. 无监督学习:虽然不需要标签,但评估更复杂

总结要点

  1. 特征(X):模型的输入,描述数据属性
  2. 样本:数据的基本单位,由特征组成
  3. 标签(y):监督学习的目标输出
  4. 数据划分:训练集用于学习,测试集用于评估
  5. 特征工程:数据预处理对模型性能至关重要

更多推荐