Python 从Scikit Learn中保存的训练分类器进行预测

Python 从Scikit Learn中保存的训练分类器进行预测,python,machine-learning,scikit-learn,classification,Python,Machine Learning,Scikit Learn,Classification,我用Python为Tweets编写了一个分类器,然后将其保存在磁盘上的.pkl格式中,这样我就可以一次又一次地运行它,而无需每次对它进行训练。代码如下: import pandas import re from sklearn.feature_extraction import FeatureHasher from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 f

我用Python为Tweets编写了一个分类器,然后将其保存在磁盘上的
.pkl
格式中,这样我就可以一次又一次地运行它,而无需每次对它进行训练。代码如下:

import pandas
import re
from sklearn.feature_extraction import FeatureHasher

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

from sklearn import cross_validation

from sklearn.externals import joblib


#read the dataset of tweets

header_row=['sentiment','tweetid','date','query', 'user', 'text']
train = pandas.read_csv("training.data.csv",names=header_row)

#keep only the right columns

train = train[["sentiment","text"]]

#remove puctuation, special characters, numbers and lower case the text

def remove_spch(text):

    return re.sub("[^a-z]", ' ', text.lower())

train['text'] = train['text'].apply(remove_spch)


#Feature Hashing

def tokens(doc):
    """Extract tokens from doc.

    This uses a simple regex to break strings into tokens.
    """
    return (tok.lower() for tok in re.findall(r"\w+", doc))

n_features = 2**18
hasher = FeatureHasher(n_features=n_features, input_type="string", non_negative=True)
X = hasher.transform(tokens(d) for d in train['text'])

y = train['sentiment']

X_new = SelectKBest(chi2, k=20000).fit_transform(X, y)

a_train, a_test, b_train, b_test = cross_validation.train_test_split(X_new, y, test_size=0.2, random_state=42)

from sklearn.ensemble import RandomForestClassifier 

classifier=RandomForestClassifier(n_estimators=10)                  
classifier.fit(a_train.toarray(), b_train)                            
prediction = classifier.predict(a_test.toarray()) 

#Export the trained model to load it in another project

joblib.dump(classifier, 'my_model.pkl', compress=9)
假设我有另一个Python文件,我想对Tweet进行分类。如何进行分类

from sklearn.externals import joblib
model_clone = joblib.load('my_model.pkl')

mytweet = 'Uh wow:@medium is doing a crowdsourced data-driven investigation tracking down a disappeared refugee boat'

直到
hasher.transform
我可以复制相同的过程,将其添加到预测模型中,但我有一个问题,即我无法计算出最佳的20k特征。要使用SelectKBest,您需要同时添加功能和标签。因为我想预测标签,所以不能使用SelectKBest。那么,我怎样才能通过这个问题继续预测呢?

我支持@EdChum的评论,即

您可以通过在数据上对模型进行训练来构建模型,这些数据可能具有足够的代表性,使其能够处理看不见的数据

实际上,这意味着您只需使用
predict
FeatureHasher
SelectKBest
应用于新数据。(在新数据上重新训练FeatureHasher是错误的,因为通常它会产生不同的特性)

也可以这样做

  • pickle
    FeatureHasher
    分别选择kbest
或(更好)

  • 制作FeatureHasher的
    管道
    ,选择kBest和
    RandomForestClassifier
    并对整个管道进行pickle。然后,您可以加载此管道并对新数据使用
    predict

对不起,您是否确实尝试过将tweet加载到一个数组中,并将其传递给您的
模型克隆
,然后调用
预测
?我是否应该从相同的准备过程中传递文本,然后尝试预测?如果我只是在列表中传递文本,然后传递给分类器,我有一个错误:
ValueError:无法将字符串转换为float:Uh-wow:@medium正在进行一项众包数据驱动的调查,追踪一艘失踪的难民船
正确您需要执行与培训时相同的特征提取,并将其作为data@EdChum这是我的问题。在前面的特征提取中,我有一个大的数据集用于训练。这是一个标签,我使用文本和标签来查找特征。当我只有一条tweet或者一个包含10条tweet但没有标签的列表时,我应该如何再次这样做,因为我正在尝试预测它?如果您能提供具体细节作为回答,我将不胜感激:)对不起,问题是您使用您的模型来预测标签是什么,它是否正确是您需要决定的。关键是,您可以通过在数据上对模型进行训练来构建模型,这些数据可能足够具有代表性,可以处理看不见的有效数据表,但不幸的是,我以前没有创建
管道。你能提供我的例子中的程序吗?Scikit learn有一个很好的例子,关于它们,有没有一种方法可以通过管道传递分类器标签?