为什么训练集用fit_transform()而测试集用transform()及sklearn.feature_extraction.text.CountVectorizer API详解

本文深入解析Sklearn中fit_transform与transform的区别,通过实例说明为何训练集与测试集需采用不同尺度化方法,强调参数一致性对模型泛化能力的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

真正讲明白的

https://blog.csdn.net/yyhhlancelot/article/details/85097656

 

API

https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html#sklearn.feature_extraction.text.CountVectorizer

 

真正讲明白的博客内容

Sklearn 里面的fit transform fit_transform的区别(为什么训练集用fit_transform()而测试集用transform()?)
 yyhhlancelot 最后发布于2018-12-19 15:34:40 阅读数 1820  收藏 12
展开
在国内网上找了很多资料,感觉都说的不明不白不清不楚,很多博客都是根据原始document来进行阐述,使用的时候也是按照格式使用,最后去外网感觉终于有点搞明白了来头。

参考:

https://stackoverflow.com/questions/23838056/what-is-the-difference-between-transform-and-fit-transform-in-sklearn
https://stackoverflow.com/questions/38692520/what-is-the-difference-between-fit-transform-and-transform-in-sklearn-countvecto
https://stackoverflow.com/questions/43675665/when-scale-the-data-why-the-train-dataset-use-fit-and-transform-but-the-te
https://sebastianraschka.com/faq/docs/scale-training-test.html
推荐大家一定点进第四个去阅读一下,如果觉得英文阅读不方便,也可以看一下我接下来的解释。

首先要提及的一点,这些方法都是用来对数据进行尺度化(标准化)。

我们使用Z-score方法将数据进行正态分布化:

对训练集使用这些方法:

fit():计算数据的参数,(均值),(标准差),并存储在对象中(例如实例化的CountVectorizer()等)。
transform():将这些参数应用到数据集,进行标准化(尺度化)。
fit_transform():将前两种方法合并,fit + transform,然后对数据集使用。
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
sc.fit_tranform(X_train)
sc.tranform(X_test)
不管是StandardScaler或是其他类,道理都是相通的,所以不用纠结类的问题。

这里就要提出来一个问题,为什么test数据集只使用transfrom()?

按照通俗的解释是 对测试集使用通过计算训练集相同的参数来进行尺度化,那到底是为什么呢?

下面我们用一个例子进行说明:

假设我的训练集有三个棒子的样本,它们分别是:

样本1:10cm  ---> class 2
样本2:20cm  ---> class 2
样本3:30cm  ---> class 1
通过给出的数据,我们可以算出以下参数:

mean : 20
std : 8.2
我们对数据进行标准化,得到以下:

样本1:-1.21  ---> class 2
样本2:0  ---> class 2
样本3:1.21  ---> class 1
现在我们对数据做一个假设结论,当小于0.6的就归到class 2,反之就归类到 class 1。这个假设看起来比较有意义,符合数据分布。

接下来,我们看看测试集的样本:

样本4:5cm  ---> class ?
样本5:6cm  ---> class ?
样本6:7cm  ---> class ?
这是“未标准化的”数据,如果我们不对它们进行标准化,那按我们刚刚的假设,那它们都属于class 1了?肯定不可能是吧,好的,那现在假如我们“重新”对它们计算参数,注意了,这里我们是针对测试集计算参数!

我们将测试集标准化后,得到了一下:

样本4:-1.21 
样本5:0 
样本6:1.21 
巧了,和刚刚训练集得到的一模一样。然后我们用我们刚刚训练集训练得到的结论,对它们分类:

样本4:-1.21  ---> class 2
样本5:0  ---> class 2
样本6:1.21  ---> class 1
奇怪的事情发生了,感觉不太对是吧?

那我们用训练集得到的参数对它们进行标准化呢:

样本4:-1.837
样本5:-1.715
样本6:-1.592
按我们开始的假设结论进行分类:

样本4:-1.837 ---> class 2
样本5:-1.715 ---> class 2
样本6:-1.592 ---> class 2
这下似乎看起来有意义多了,我们训练集似乎训练了一个比较说的通的模型(刚刚的假设结论~)。所以,你经常看到为什么大家在说,如果对test_data进行fit_transform()就会"overfitting"就是这么来的。
————————————————
版权声明:本文为CSDN博主「yyhhlancelot」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yyhhlancelot/article/details/85097656

### 数据处理与机器学习建模详解 #### 使用 Pandas 和 NumPy 进行数据预处理 Pandas 是一种强大的数据分析工具,能够轻松加载、清洗和转换数据。NumPy 则提供了高效的数值运算能力,适合用于矩阵操作和其他数学计算。 以下是使用 Pandas 加载 CSV 文件并进行初步探索的例子: ```python import pandas as pd # 加载数据 data = pd.read_csv('dataset.csv') # 查看前几行数据 print(data.head()) # 统计描述性信息 print(data.describe()) ``` 对于缺失值的处理,可以通过填充或删除来完成: ```python # 填充缺失值 data.fillna(value={'column_name': 'default_value'}, inplace=True) # 删除含有缺失值的行 data.dropna(inplace=True) ``` NumPy 可以用来执行更复杂的数组操作,例如标准化特征值: ```python import numpy as np # 标准化列 mean = data['feature_column'].mean() std_dev = data['feature_column'].std() data['normalized_feature'] = (data['feature_column'] - mean) / std_dev ``` --- #### 文本向量化:TF-IDF 方法 在文本分类任务中,`TfidfVectorizer` 将文本转化为稀疏矩阵表示形式,其中每一项代表某个单词的重要性[^3]。 代码如下: ```python from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(max_features=1000, stop_words='english') X_tfidf = vectorizer.fit_transform(data['text_column']) ``` --- #### 应用多种机器学习算法 下面详细介绍几种常见算法及其优化方式: ##### 支持向量机(SVC) 支持向量机是一种有效的二分类或多分类方法,在高维空间表现良好。 ```python from sklearn.svm import SVC from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X_tfidf, data['label'], test_size=0.2, random_state=42) svc_model = SVC(kernel='linear', C=1.0).fit(X_train, y_train) accuracy_svc = svc_model.score(X_test, y_test) print(f'SVC Accuracy: {accuracy_svc}') ``` ##### 决策树 决策树易于理解且无需过多假设调整,但在复杂场景下容易过拟合。 ```python from sklearn.tree import DecisionTreeClassifier tree_model = DecisionTreeClassifier(max_depth=5).fit(X_train, y_train) accuracy_tree = tree_model.score(X_test, y_test) print(f'Decision Tree Accuracy: {accuracy_tree}') ``` ##### 朴素贝叶斯 适用于离散型特征的数据集,尤其擅长于文本分类任务。 ```python from sklearn.naive_bayes import MultinomialNB nb_model = MultinomialNB().fit(X_train, y_train) accuracy_nb = nb_model.score(X_test, y_test) print(f'Naive Bayes Accuracy: {accuracy_nb}') ``` ##### 逻辑回归 逻辑回归常被应用于二元分类问题,并可通过正则化防止过拟合。 ```python from sklearn.linear_model import LogisticRegression logreg_model = LogisticRegression(C=1.0, solver='liblinear').fit(X_train, y_train) accuracy_logreg = logreg_model.score(X_test, y_test) print(f'Logistic Regression Accuracy: {accuracy_logreg}') ``` ##### k近邻算法(KNN) k近邻依赖样本之间的距离度量来进行预测,因此对特征缩放敏感。 ```python from sklearn.neighbors import KNeighborsClassifier knn_model = KNeighborsClassifier(n_neighbors=5).fit(X_train.toarray(), y_train) accuracy_knn = knn_model.score(X_test.toarray(), y_test) print(f'KNN Accuracy: {accuracy_knn}') ``` ##### 随机森林 随机森林由多个决策树组成,具有较强的泛化能力和鲁棒性。 ```python from sklearn.ensemble import RandomForestClassifier rf_model = RandomForestClassifier(n_estimators=100, max_depth=None).fit(X_train, y_train) accuracy_rf = rf_model.score(X_test, y_test) print(f'Random Forest Accuracy: {accuracy_rf}') ``` ##### Bagging 分类器 Bagging 技术通过对子模型采样提升整体稳定性。 ```python from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier bagging_model = BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=10, max_samples=0.8, bootstrap=True).fit(X_train, y_train) accuracy_bagging = bagging_model.score(X_test, y_test) print(f'Bagging Classifier Accuracy: {accuracy_bagging}') ``` --- #### 超参数调优 为了进一步提高模型性能,可采用 `GridSearchCV` 或 `RandomizedSearchCV` 来寻找最佳超参数配置[^2]。 示例代码: ```python from sklearn.model_selection import GridSearchCV param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']} grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring='accuracy', n_jobs=-1) grid_search.fit(X_train, y_train) best_params = grid_search.best_params_ print(f'Best Parameters: {best_params}') ``` --- ### 总结 通过结合 Pandas 和 NumPy 完成数据清理与准备后,可以灵活运用 Scikit-learn 中的不同算法解决实际问题。每种算法都有其适用范围和局限性,合理选择并配合超参数调优策略有助于获得更好的效果[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值