在完成数据探索之后,我们需要将短信文本转换为机器学习可用的特征,以便进行分类任务。
这部分包括以下内容:
- 处理类别标签:将垃圾短信(Spam)和正常短信(Ham)转换为数值型标签。
- 文本特征提取:使用TF-IDF 和词频向量(Bag of Words, BoW) 提取文本特征。
- 数据集划分:划分训练集和测试集,以便后续模型训练和评估。
3.1 处理类别标签
我们的目标是将 label 列(Ham / Spam)转换为数值型数据:
- Spam → 1
- Ham → 0
from sklearn.preprocessing import LabelEncoder
# 使用 LabelEncoder 进行标签编码
label_encoder = LabelEncoder()
df["label_encoded"] = label_encoder.fit_transform(df["label"])
# 查看编码结果
df[["label", "label_encoded"]].head(10)
label_encoded列现在包含 0(Ham) 和1(Spam),可以用于分类模型。
3.2 文本特征提取
3.2.1 词频向量(Bag of Words, BoW)
Bag of Words 方法将文本转换为词频矩阵,每个短信对应一个向量,表示其包含的单词数量。
from sklearn.feature_extraction.text import CountVectorizer
# 创建 BoW 特征提取器
bow_vectorizer = CountVectorizer(stop_words='english', max_features=3000)
# 进行特征转换
X_bow = bow_vectorizer.fit_transform(df["message"])
# 查看特征矩阵形状
print(f"BoW 特征矩阵维度: {X_bow.shape}")
X_bow是一个 (样本数, 3000) 的稀疏矩阵,每一行对应一条短信,每一列对应某个单词的出现次数。
3.2.2 TF-IDF 特征
TF-IDF(Term Frequency-Inverse Document Frequency)可以衡量单词在文本中的重要性,而不仅仅是出现的次数。
from sklearn.feature_extraction.text import TfidfVectorizer
# 创建 TF-IDF 特征提取器
tfidf_vectorizer = TfidfVectorizer(stop_words='english', max_features=3000)
# 进行特征转换
X_tfidf = tfidf_vectorizer.fit_transform(df["message"])
# 查看特征矩阵形状
print(f"TF-IDF 特征矩阵维度: {X_tfidf.shape}")
X_tfidf也是一个 (样本数, 3000) 的稀疏矩阵,每一行是短信的 TF-IDF 特征向量。
3.3 数据集划分
为了训练和评估模型,我们将数据集拆分为 训练集(Train Set) 和测试集(Test Set):
- 训练集(80%) 用于训练模型
- 测试集(20%) 用于评估模型性能
from sklearn.model_selection import train_test_split
# 选择 TF-IDF 特征
X = X_tfidf # 也可以替换为 X_bow
y = df["label_encoded"]
# 数据集划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 查看训练集和测试集的样本数量
print(f"训练集样本数: {X_train.shape[0]}, 测试集样本数: {X_test.shape[0]}")
- 80% 数据用于训练,20% 数据用于测试,并保持 Spam 和 Ham 的比例相同(
stratify=y)。
3.4 小结
- 类别标签转换:将
label由Ham/Spam 转换为0/1,便于分类任务。 - 文本特征提取:采用TF-IDF 和BoW 提取短信文本特征。
- 数据集划分:使用
train_test_split将数据拆分为训练集(80%)和测试集(20%)。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END












请登录后查看评论内容