Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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 重塑pandas.Df以在GridSearch中使用_Python_Numpy_Machine Learning_Scikit Learn_Grid Search - Fatal编程技术网

Python 重塑pandas.Df以在GridSearch中使用

Python 重塑pandas.Df以在GridSearch中使用,python,numpy,machine-learning,scikit-learn,grid-search,Python,Numpy,Machine Learning,Scikit Learn,Grid Search,我正在尝试在GridSearch和管道中使用多个功能列。因此,我传递了两列,我想对它们执行TFIDFvectorier,但在运行GridSearch时遇到了麻烦 Xs = training_data.loc[:,['text','path_contents']] y = training_data['class_recoded'].astype('int32') for col in Xs: print Xs[col].shape print Xs.shape print y.sha

我正在尝试在GridSearch和管道中使用多个功能列。因此,我传递了两列,我想对它们执行TFIDFvectorier,但在运行GridSearch时遇到了麻烦

Xs = training_data.loc[:,['text','path_contents']]
y = training_data['class_recoded'].astype('int32')

for col in Xs:
    print Xs[col].shape

print Xs.shape
print y.shape

# (2464L,)
# (2464L,)
# (2464, 2)
# (2464L,)

from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import GridSearchCV

pipeline = Pipeline([('vectorizer', TfidfVectorizer(encoding="cp1252", stop_words="english")), 
                     ('nb', MultinomialNB())])

parameters = {
    'vectorizer__max_df': (0.48, 0.5, 0.52,),
    'vectorizer__max_features': (None, 8500, 9000, 9500),
    'vectorizer__ngram_range': ((1, 3), (1, 4), (1, 5)),
    'vectorizer__use_idf': (False, True)
}

if __name__ == "__main__":
    grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=2)
    grid_search.fit(Xs, y) # <- error thrown here

    print("Best score: {0}".format(grid_search.best_score_))  
    print("Best parameters set:")  
    best_parameters = grid_search.best_estimator_.get_params()  
    for param_name in sorted(list(parameters.keys())):  
        print("\t{0}: {1}".format(param_name, best_parameters[param_name]))
我尝试按照建议使用
.values
,如下所示:

grid_search.fit(Xs.values, y.values) 
但这给了我以下错误:

AttributeError:'numpy.ndarray'对象没有属性'lower'


发生了什么事?我不知道如何继续。TfidVectorizer需要输入一个字符串列表。这就解释了“AttributeError:'numpy.ndarray'对象没有属性'lower'”,因为您输入了2d数组,这意味着数组列表

因此,您有两种选择,或者预先将2列合并为1列(在熊猫中),或者如果希望保留2列,可以在管道中使用要素联合()


关于第一个例外,我想这是因为熊猫和猫科动物之间的交流。但是,由于代码中存在上述错误,您无法确定。

TfidfVectorizer.fit()
需要一个iterable对象,它的元素是字符串,但是
Xs
包含两列,因此,
Xs
的每个元素都是数组对象,当
TfidfVectorizer
调用
lower()
Xs
中的items方法,它会引发AttributeError:'numpy.ndarray'对象没有属性'lower'。因此,问题是为什么要将两列传递给
TfidfVectorizer
。正如我在回答您的问题时所建议的那样,在管道内部的TfidfVectorizer中使用多列并不是那么简单。如果第一个异常是“Error:ValueError:founded input variables with inconsistent number of samples:[2,2464]”,我想说,这也是由于输入格式错误造成的。由于Xs是一个由2列组成的列表,y是长度为2464的序列,这使得消息[22464]成为一个字符串。
grid_search.fit(Xs.values, y.values)