Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 您需要在sklearn中缩放矢量器吗?_Python_Machine Learning_Scikit Learn - Fatal编程技术网

Python 您需要在sklearn中缩放矢量器吗?

Python 您需要在sklearn中缩放矢量器吗?,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我有一组自定义功能和一组使用矢量器创建的功能,在本例中为TfidfVectorizer 我的所有自定义功能都是简单的np.Array(例如[0,5,4,22,1])。我正在使用StandardScaler来缩放我的所有功能,正如您在我的管道中看到的,在我的“自定义管道”后面调用StandardScaler。问题是是否有方法或需要缩放我在“矢量化的_管道”中使用的矢量器。在矢量器上应用StandardScaler似乎不起作用(我得到以下错误:“ValueError:无法将稀疏矩阵居中”) 还有一个

我有一组自定义功能和一组使用矢量器创建的功能,在本例中为TfidfVectorizer

我的所有自定义功能都是简单的np.Array(例如[0,5,4,22,1])。我正在使用StandardScaler来缩放我的所有功能,正如您在我的管道中看到的,在我的“自定义管道”后面调用StandardScaler。问题是是否有方法或需要缩放我在“矢量化的_管道”中使用的矢量器。在矢量器上应用StandardScaler似乎不起作用(我得到以下错误:“ValueError:无法将稀疏矩阵居中”)

还有一个问题,在我加入FeatureUnion后缩放我的所有功能是明智的还是应该分别缩放它们(在我的示例中,通过分别调用“pos_cluster”和“style_features”中的scaler,而不是在两者都加入后调用它),这样做的更好实践是什么

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)
对于稀疏矩阵,这将导致密集矩阵,因为平均值(f_i)将不为零(通常)。在实践中,只有等于其平均值的特征最终将为零。Scikit learn不想这样做,因为这是对数据的巨大修改,可能会导致代码的其他部分出现故障,占用大量内存等。如何处理?如果您真的想这样做,有两种选择:

  • 通过.toarray()加密您的矩阵,这将需要大量内存,但将提供您所期望的内容
  • 创建无均值的StandardScaler,因此安装的
    StandardScaler(with_mean=False)
    将应用
    f_i=f_i/std(f_i)
    ,但将保留稀疏的数据格式
需要scalind吗? 这是一个完全不同的问题——通常,缩放(任何形式)只是一种试探法。这不是你必须应用的东西,也不能保证它会有帮助,当你不知道你的数据是什么样子的时候,这只是一个合理的做法。tfidf等“智能”矢量器实际上已经在这样做了。idf转换应该创建一种合理的数据缩放。不能保证哪一个更好,但总的来说,tfidf应该足够了。特别是考虑到这样一个事实,它仍然支持稀疏计算,而StandardScaler不支持