本文内容改编自过往客户咨询项目的技术沉淀并且已通过实际业务校验,该项目完整代码与数据已分享至交流社群。阅读原文进群获取完整代码数据及更多最新AI见解和行业洞察,可与900+行业人士交流成长;还提供人工答疑,拆解核心原理、代码逻辑与业务适配思路,帮大家既懂怎么做,也懂为什么这么做;遇代码运行问题,更能享24小时调试支持。

我们将以新闻文本数据集为例,通过合成元数据特征,分别构建三条特征处理分支,最后利用 ColumnTransformer 将它们无缝拼接,并训练一个逻辑回归分类器。整个过程既展示了 Scikit-learn 的灵活性与强大功能,也体现了多源信息融合在提升分类准确性上的巨大潜力。下图概括了本文的核心技术脉络:

数据加载
   |
   v
特征工程分支
+---------+---------+
|         |         |
v         v         v
TF-IDF   LLM嵌入   元数据
|         |         |
v         v         v
降维(SVD) 直接使用  标准化
|         |         |
+---------+---------+
         |
         v
    ColumnTransformer
         |
         v
   特征融合
         |
         v
   分类器(LogisticRegression)
         |
         v
   模型评估

成为新会员获取本项目完整代码和数据资料

加入会员群

数据准备与特征工程

数据集选择与加载

我们选用 Scikit-learn 内置的 20 数据集,它包含了来自不同新闻组的文章,非常适合文本分类演练。为了降低计算开销并突出多源特征融合的效果,我们仅选取四个具有代表性的类别:棒球、太空、计算机图形学和政治。下面的代码实现了数据加载与初步筛选:

本项目完整代码和数据资料

下载资料(17页)

合成结构化元数据

现实场景中,文本数据往往伴随丰富的元信息,如文章长度、单词数、大小写比例等。本例中我们基于原始文本合成五类元数据特征,用以模拟真实业务中的结构化信息:

def build_metadata(text_list):
    # 计算文本长度
    char_cnt = [len(t) for t in text_list]
    word_cnt = [len(t.split()) for t in text_list]
    
    avg_word_len = []
    upper_ratio = []
    digit_ratio = []
    
    for t in text_list:
        words = t.split()
        if words:
            avg_word_len.append(np.mean([len(w) for w in words]))
        else:
            avg_word_len.append(0)
        denom = max(len(t), 1)
        upper_ratio.append(sum(1 for c in t if c.isupper()) / denom)
        digit_ratio.append(sum(1 for c in t if c.isdigit()) / denom)
    
    return pd.DataFrame({
        'raw_text': text_list,
        'char_len': char_cnt,
        'word_num': word_cnt,
        'avg_word_len': avg_word_len,
        'upper_frac': upper_ratio,
        'digit_frac': digit_ratio
    })

# 生成完整DataFrame
news_df = build_metadata(texts_raw)
news_df['target'] = labels_raw
news_df.head()

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。


训练/测试集划分

在构建任何特征之前,必须先将数据划分为训练集和测试集,以防止信息泄露。这里我们采用分层抽样确保类别分布一致:

from sklearn.model_selection import train_test_split

X_all = news_df.drop(columns=['target'])
y_all = news_df['target']

X_train, X_test, y_train, y_test = train_test_split(
    X_all, y_all, 
    test_size=0.2, 
    random_state=2025, 
    stratify=y_all
)

构建多源特征处理分支

1. TF-IDF特征管道

TF-IDF能够捕捉词频与逆文档频率信息,是经典的文本统计特征。我们首先构建一个包含向量化与降维的管道:

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD

# TF-IDF + SVD降维管道
tfidf_flow = Pipeline([
    ('vectorizer', TfidfVectorizer(max_features=5000)),
    ('svd_reduce', TruncatedSVD(n_components=300, random_state=2025))
])

2. LLM语义嵌入管道

使用预训练的 Sentence Transformer 模型将文本转换为稠密向量,这里我们封装了一个自定义的 Scikit-learn 转换器:

from sklearn.base import BaseEstimator, TransformerMixin
from sentence_transformers import SentenceTransformer

class TextEmbedder(BaseEstimator, TransformerMixin):
    def __init__(self, model_id="all-MiniLM-L6-v2"):
        self.model_id = model_id
        self.encoder = None
    
    def fit(self, X, y=None):
        self.encoder = SentenceTransformer(self.model_id)
        return self
    
    def transform(self, X):
        # 生成嵌入向量,省略进度条显示
        embeddings = self.encoder.encode(
            X.tolist(),
            show_progress_bar=False
        )
        return np.array(embeddings)

embed_flow = Pipeline([
    ('embedder', TextEmbedder())
])

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。

3. 元数据标准化管道

元数据特征具有不同的量纲,需要标准化处理:

from sklearn.preprocessing import StandardScaler

# 元数据特征列名
meta_cols = ['char_len', 'word_num', 'avg_word_len', 'upper_frac', 'digit_frac']

meta_flow = Pipeline([
    ('scaler', StandardScaler())
])

相关文章封面

DeepSeek、LangGraph和Python融合LSTM、RF、XGBoost、LR多模型预测NFLX股票涨跌|附完整代码数据

探索观点

特征融合与分类器集成

使用 ColumnTransformer 合并多源特征

ColumnTransformer 允许我们将不同列(或数据源)分别应用不同的转换器,然后将结果横向拼接:

from sklearn.compose import ColumnTransformer

# 融合三个分支
feature_union = ColumnTransformer(
    transformers=[
        ('tfidf_branch', tfidf_flow, 'raw_text'),
        ('embed_branch', embed_flow, 'raw_text'),
        ('meta_branch', meta_flow, meta_cols)
    ],
    remainder='drop'   # 丢弃未指定的列
)

构建端到端分类管道

最后,将特征融合步骤与分类器组合成一个完整的管道,实现从原始数据到预测的无缝衔接:

from sklearn.linear_model import LogisticRegression

final_pipeline = Pipeline([
    ('assemble', feature_union),
    ('classifier', LogisticRegression(max_iter=2000))
])

# 训练模型(此处省略部分超参数调优代码)
final_pipeline.fit(X_train, y_train)
......

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。


模型评估与结果分析

在测试集上评估融合模型的表现,输出详细的分类指标:

from sklearn.metrics import classification_report

y_pred = final_pipeline.predict(X_test)
print(classification_report(y_test, y_pred, target_names=raw_news.target_names))

下图直观展示了整个管道的构建流程:

阅读原文进群获取完整内容及更多AI见解、行业洞察,与900+行业人士交流成长。


结语

本文详细阐述了如何在 Scikit-learn 中融合大语言模型嵌入、TF-IDF 统计特征与结构化元数据,构建一个统一、高效的文本分类管道。通过 ColumnTransformerPipeline 的巧妙组合,我们不仅避免了繁琐的手动特征拼接,还确保了交叉验证、超参数搜索等环节的严谨性。这种多源信息融合的思路可以广泛推广到各类实际业务场景,例如用户评论分析、工单分类、舆情监控等。希望本文能为您的机器学习项目提供一些有价值的参考。