如何根据回归模型的预测值计算标签?

时间:2016-12-08 09:08:57

标签: python machine-learning classification linear-regression

我正在研究机器学习项目。我需要创建两个python脚本:

1)分类器
2)使用该分类器生成标签的文本文件。

我只是在第一个脚本中保存模型。然后,在第二个脚本中,我将该模型应用于包含文本的不同数据集,以生成预测标签(火腿或垃圾邮件)并将这些预测标签保存在文本文件中。

基本上我有一个带有标签,火腿或垃圾邮件的文本列表。

我使用线性回归模型创建了一个分类器。我有两个不同的训练数据文件(texts_traininglabels_training),因此我将训练数据加载到称为文本和标签的变量中。然后,我研究了分类器。这就是我对分类器的看法:

#classifier.py 
def features (words):
     fe = np.ndarrary ((len(tweets), 56) 
          for t, text in enumerate (words):
               if "money" in text:
                   money = 1
               else:
                   money = 0

               ...(55 more features)

               fe = [i:] = [money, ...]
         return fe
fe = features (words)

feat.shape
>>>(1000, 56)

import sklearn
X = fe
label = preprocessing.LabelEncoder()
label.fit(labels)
label = lab.transform(labels)
y.shape
>>>(1000,)


from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split (X,y, random_state = 4)

from sklearn.preprocessing import StandardScaler
scaler = preprocessing.StandardScaler().fit(X_train)


#Model
from sklearn.linear_model import LinearRegression
clf = LinearRegression()
clf = lreg.fit(X, y) 

import pickle
f = open ("clf.pkl", "w")
pickle.dump ((clf, f)
f.close ()

现在,我将其加载到另一个脚本中,但两个脚本都保存在同一个文件夹中。该脚本基本上必须使用该分类器来保存txt中生成的标签。

system.py

    def features (words):
     fe = np.ndarrary ((len(tweets), 56) 
          for t, text in enumerate (words):
               if "money" in text:
                   money = 1
               else:
                   money = 0

               ...(55 more features)

               feat = [t, :] = [money, ...]
         return fe
fe = features (words)

X = feat
from sklearn import preprocessing
label = preprocessing.LabelEncoder()
label.fit(labels)
label = label.transform(labels) 
y = label
from sklearn.preprocessing import StandardScaler
scaler = preprocessing.StandardScaler().fit(X)



import pickle
#class_output = pickle.load (open('clf.pkl', 'r'))
loaded_model = pickle.load (open('clf.pkl', 'r'))

class_output = loaded_model.predict (X)

**print class_output
>>>array([ 0.06140778,  0.053107  ,  0.14343903, ...,  0.05701325,
    0.18738435, -0.08788421])**

f = open ("labels_produced.txt", "w")
for output in class_output:
    if output ==0:
        f.write ("ham\n")
    else:
        f.write("spam\n")
f.close()

但是,如何计算新数据集的垃圾邮件或火腿,因为class_output中的值都不等于0.我的功能设置为0或1.

我是初学者,今天我一整天都在苦苦思索。我不明白为什么我得到这个错误以及如何解决它。如果有人帮忙,我会非常感激。

1 个答案:

答案 0 :(得分:0)

您正在尝试迭代一个对象。这就是错误的含义:

'LinearRegression' object is not iterable'

这可以通过以下方式看出:

type(clf) = sklearn.linear_model.base.LinearRegression

clf是一个LinearRegression对象,具有自己的一系列属性。你不能像尝试在行中那样迭代它:

for output in class_output:
    if output == 0:
        # etc

在将它们保存到Pickle之前或尝试迭代它们之前,您需要从LinearRegression对象clf中提取所需的属性。

LinearRegression对象中包含多个属性。 例如,以下是您的LinearRegression拟合系数的五个:

Coefficients = clf.coef_

如果您决定实际想要迭代的clf属性,可以按上面显示的方式提取它。

编辑:此处提供LinearRegression对象中的属性列表:

  

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

     

coef_:array,shape(n_features,)或(n_targets,n_features)

     

线性回归问题的估计系数。如果在拟合期间传递了多个目标(y 2D),则这是一个形状的二维数组(n_targets,n_features),而如果只传递一个目标,则这是一个长度为n_features的一维数组。

     

residue_:array,shape(n_targets,)或(1,)或empty

     

残差总和。在拟合期间通过的每个目标的平方欧几里德2范数。如果线性回归问题不确定(训练矩阵的线性独立行的数量小于其线性独立列的数量),则这是一个空数组。如果在拟合期间传递的目标矢量是1维的,则这是(1)形状阵列。   版本0.18中的新功能。

     

intercept_:array

     

线性模型中的独立术语。

编辑:这里有很好的例子:

http://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html

进一步的问题:

在您的函数features中,您似乎已传递(texts),然后在列表0中保存功能1feat 。但是在函数结束时,您返回re而不是返回feat。如果您返回feat,您可能会收到所需的信息。此外,您使用变量t,text进行迭代,然后在(feat = [i:] = [money, ...])中使用变量feat分配i数组中的值。 i应该替换t吗?