【问题标题】:How to compute labels from predicted values of regression model?如何根据回归模型的预测值计算标签?
【发布时间】:2017-04-23 11:10:56
【问题描述】:

我正在从事一个机器学习项目。我需要创建两个 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。

我是初学者,今天我一直在为此苦苦挣扎。我不明白为什么我会收到此错误以及如何修复它。如果有人提供帮助,我将不胜感激。

【问题讨论】:

  • clftype是什么,在你写clf = lreg.fit(X, y)之后?
  • ;我如何找到类型?文本和标签变量在 numpy.ndarray
  • 1.请避免函数调用和括号之间有空格。 2. pickle.dump((clf,f) 产生语法错误 3. 那行也保存了拟合的模型,但没有保存数据!你需要再次预测。为什么这么早创建文件对象 f?labels_produced 背后的逻辑。 txt 我不清楚。顺便说一句。线性回归通常不是(!)分类器。
  • @Quickbeam2k1 我只是将模型保存在第一个脚本中。然后我将该模型应用于包含文本的不同数据集以生成预测标签(火腿或垃圾邮件)并将这些预测标签保存在文本文件中。
  • 您正在保存模型。该模型不包含任何输出值。但是,如果您对输入进行迭代,则可以将模型应用于该输入并获得输出,hamspam。我想你想存储这些输出。但目前,你没有这样做

标签: python machine-learning classification linear-regression


【解决方案1】:

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

'LinearRegression' object is not iterable'

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

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

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

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

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

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

Coefficients = clf.coef_

如果你决定了你真正想要迭代的 clf 的哪个属性,你可以按照上面显示的方式提取它。

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

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

coef_ : 数组,形状 (n_features, ) 或 (n_targets, n_features)

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

residues_ : 数组、形状 (n_targets,) 或 (1,) 或空

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

拦截_:数组

线性模型中的独立项。

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

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

另一个问题:

在您的函数features 中,看起来您传入了(texts),然后在feat 列表中保存了一个功能是0 还是1。但在函数结束时,您返回 re 而不是返回 feat。如果您返回feat,您可能会得到您想要的信息。此外,您使用变量 t,text 进行迭代,然后在 (feat = [i:] = [money, ...]) 中使用变量 i 分配 feat 数组中的值。 i 是否应该替换为 t

【讨论】:

  • 谢谢,有没有办法可以使用我在 classifier.py features 方法中使用的功能? (即金钱)。目前,这就是我正在做的事情。但这也不起作用
  • 函数特性的期望输出并不明显。在执行正确的 LinearRegression 拟合之前传入文本文件。您需要使用 Pickle 保存输出属性。
  • 我使用了 Coefficient 属性,但这产生了一个带有 56 个垃圾邮件标签的文本文件(我的数据集有 1000 行文本需要分类),这可能是由于(对于 class_output 中的输出:如果输出 ==0 :) 我的代码的一部分。有没有其他方法可以将它们标记为火腿或垃圾邮件?
  • 在你的函数特征中,看起来你传入了你的(texts),然后在列表feat中保存一个特征是0还是1。但是在函数结束时,你返回re而不是返回feat。如果你返回feat,你可能会得到你想要的信息。此外,你用变量t,text进行迭代,然后在(feat = [i:] = [money, ...]你分配你的@987654350中的值使用变量i 的@ 数组。应将i 替换为t
  • 另外,你的函数应该是:def features (words):fe = np.ndarrary ((len(tweets), 56)for t, text in enumerate (words):?而不是for t, text in enumerate (texts):
猜你喜欢
  • 2021-02-25
  • 2014-04-08
  • 2019-03-20
  • 2021-02-17
  • 2019-07-07
  • 2016-08-18
  • 2019-07-03
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多