我正在研究机器学习项目。我需要创建两个python脚本:
1)分类器
2)使用该分类器生成标签的文本文件。
我只是在第一个脚本中保存模型。然后,在第二个脚本中,我将该模型应用于包含文本的不同数据集,以生成预测标签(火腿或垃圾邮件)并将这些预测标签保存在文本文件中。
基本上我有一个带有标签,火腿或垃圾邮件的文本列表。
我使用线性回归模型创建了一个分类器。我有两个不同的训练数据文件(texts_training
和labels_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.
我是初学者,今天我一整天都在苦苦思索。我不明白为什么我得到这个错误以及如何解决它。如果有人帮忙,我会非常感激。
答案 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
中保存功能1
或feat
。但是在函数结束时,您返回re
而不是返回feat
。如果您返回feat
,您可能会收到所需的信息。此外,您使用变量t,text
进行迭代,然后在(feat = [i:] = [money, ...])
中使用变量feat
分配i
数组中的值。 i
应该替换t
吗?