gpt4 book ai didi

python - 你需要在 sklearn 中缩放 Vectorizers 吗?

转载 作者:行者123 更新时间:2023-11-28 21:10:24 29 4
gpt4 key购买 nike

我有一组自定义特征和一组使用 Vectorizers 创建的特征,在本例中为 TfidfVectorizer。

我所有的自定义特征都是简单的 np.arrays(例如 [0, 5, 4, 22, 1])。我正在使用 StandardScaler 来扩展我的所有功能,正如您在我的“自定义管道”之后通过调用 StandardScaler 在我的管道中看到的那样。问题是是否有办法或需要扩展我在“vectorized_pipeline”中使用的 Vectorizers。在向量化器上应用 StandardScaler 似乎不起作用(我收到以下错误:“ValueError:无法居中稀疏矩阵”)。

还有一个问题,在我将所有特征加入 FeatureUnion 后缩放我的所有特征是否明智,或者我是否分别缩放它们中的每一个(在我的示例中,通过分别调用“pos_cluster”和“stylistic_features”中的缩放器而不是在它们都加入后调用它),这样做的更好做法是什么?

from sklearn.pipeline import FeatureUnion, Pipeline
from sklearn import feature_selection
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

X = ['I am a sentence', 'an example']
Y = [1, 2]
X_dev = ['another sentence']

inner_scaler = StandardScaler()
# classifier
LinearSVC1 = LinearSVC(tol=1e-4, C = 0.10000000000000001)

# vectorizers
countVecWord = TfidfVectorizer(ngram_range=(1, 3), max_features=2000, analyzer=u'word', sublinear_tf=True, use_idf = True, min_df=2, max_df=0.85, lowercase = True)
countVecWord_tags = TfidfVectorizer(ngram_range=(1, 4), max_features= 1000, analyzer=u'word', min_df=2, max_df=0.85, sublinear_tf=True, use_idf = True, lowercase = False)


pipeline = Pipeline([
('union', FeatureUnion(
transformer_list=[

('vectorized_pipeline', Pipeline([
('union_vectorizer', FeatureUnion([

('stem_text', Pipeline([
('selector', ItemSelector(key='stem_text')),
('stem_tfidf', countVecWord)
])),

('pos_text', Pipeline([
('selector', ItemSelector(key='pos_text')),
('pos_tfidf', countVecWord_tags)
])),

])),
])),


('custom_pipeline', Pipeline([
('custom_features', FeatureUnion([

('pos_cluster', Pipeline([
('selector', ItemSelector(key='pos_text')),
('pos_cluster_inner', pos_cluster)
])),

('stylistic_features', Pipeline([
('selector', ItemSelector(key='raw_text')),
('stylistic_features_inner', stylistic_features)
]))

])),
('inner_scale', inner_scaler)
])),

],

# weight components in FeatureUnion
# n_jobs=6,

transformer_weights={
'vectorized_pipeline': 0.8, # 0.8,
'custom_pipeline': 1.0 # 1.0
},
)),

('clf', classifier),
])

pipeline.fit(X, Y)
y_pred = pipeline.predict(X_dev)

最佳答案

要事第一:

错误“无法居中稀疏矩阵”

原因很简单 - StandardScaler 有效地应用特征转换:

f_i = (f_i - mean(f_i)) / std(f_i)

这对于稀疏矩阵将导致密集矩阵,因为 mean(f_i) 将是非零的(通常)。在实践中,只有等于其均值的特征才会最终为零。 Scikit learn 不想这样做,因为这是对你的数据的巨大修改,这可能会导致代码的其他部分失败,大量使用内存等。如何处理?如果您真的想这样做,有两种选择:

  • 通过 .toarray() 对您的矩阵进行致密化,这将需要大量内存,但会为您提供您所期望的结果
  • 创建没有均值的 StandardScaler,因此 StandardScaler(with_mean = False) 将应用 f_i = f_i/std(f_i),但会保留数据的稀疏格式.

需要scalind吗?

这完全是另一个问题 - 通常,(任何形式的)缩放只是一种启发式。这不是您必须应用的东西,也不能保证它会有所帮助,当您不知道您的数据是什么样子时,这只是一件合理的事情。 “智能”矢量化器,例如 tfidf 实际上已经在这样做了。 idf 转换应该创建一种合理的数据缩放。不能保证哪个更好,但总的来说,tfidf 应该足够了。特别是考虑到它仍然支持稀疏计算,而 StandardScaler 不支持这一事实。

关于python - 你需要在 sklearn 中缩放 Vectorizers 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675022/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com