【问题标题】:Training a Logistic Classifier训练一个逻辑分类器
【发布时间】:2017-08-10 21:20:16
【问题描述】:

我正在尝试训练一个逻辑分类器。我的数据集有以下列。

namereviewratingreviews_cleanedword_count情绪

根据评分是否大于或小于 3,情绪是 +1 或 -1。字数统计包含出现次数的单词字典,reviews_cleaned 只是将评论从标点符号中剔除。

这是我训练 LogisticClassifier 的代码。

train_data, test_data = train_test_split(products, test_size = 0.2)
sentiment_model = LogisticRegression(penalty='l2', C=1)
sentiment_model.fit(products['sentiment'], products['word_count'])

我收到以下错误,

ValueError: Found input variables with inconsistent numbers of samples: [1, 166752]

PS:使用graphLabcreate 的等效语句是

sentiment_model = graphlab.logistic_classifier.create(train_data,
                                                      target = 'sentiment',
                                                      features=['word_count'],
                                                      validation_set=None)

我做错了什么?

【问题讨论】:

  • 试试sentiment_model.fit(products[['word_count']], products['sentiment'])
  • 返回ValueError: Unknown label type: 'unknown'
  • 我没有意识到您的目标和功能已被切换。在fit方法中,输入是fit(X, y, ...),其中X是一个数组,y是一个向量。
  • 进一步介绍 ssm 的 cmets。如果您使用单个括号进行子集化。例如df[colname] 它返回一个熊猫系列对象。然而,如果您使用双括号进行子集化,例如df[[colname]] 它将返回一个数据框。系列是一维的,而数据框是二维的。假设您的数据(即产品)实际上是 pandas.DataFrame。
  • 不是那种形式。您将不得不转换数据。如果要将每个单词用作模型的特征,则需要为每个单词创建一个列,并且值将是相应的字数。请参阅 sklearn 的 CountVectorizer。它从原始文本生成这样一个二维矩阵并使用稀疏矩阵对象,这将确保它不会消耗太多内存。

标签: python machine-learning scikit-learn classification


【解决方案1】:

您的训练数据看起来像是一维向量,但 sklearn 要求它是二维的 - 如果您 reshape 它应该没问题。此外,您还进行了训练/测试拆分,但实际上并没有使用您正在生成的数据(改为适合 train_data)。

【讨论】:

  • 我已经进行了适当的修改以使用 train_data,但是您能否为我正在重塑的内容编写等效的代码。抱歉,我是新手。
【解决方案2】:

在该过程中使用GraphLab是非常 em>刺激性最少。给这个旋转:

from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.feature_extraction.text import CountVectorizer

df = pd.read_csv('amazon_baby.csv', header = 0)

df.dropna(how="any", inplace= True)

products = df[df['rating'] != 3] #drop the products with 3-star rating
products['sentiment'] = products['rating'] >= 4

X_train, X_test, y_train, y_test = train_test_split(products['review'], products['sentiment'], test_size = .2 ,random_state = 0)

vect = CountVectorizer()
X_train = vect.fit_transform(X_train.values)
X_test = vect.transform(X_test.values)

model = LogisticRegression(penalty ='l2', C = 1)
model.fit(X_train, y_train)

我不确定sklearn / pandas和graphlab之间的直接翻译是什么,但这看起来就像他们在做什么。

当我得分模型时,我得到:

model.score(X_test, y_test)
> .93155480

让我知道你得到了什么结果,或者如果这适用于你。

【讨论】:

    猜你喜欢
    • 2016-02-01
    • 2013-04-11
    • 2015-11-11
    • 2014-05-28
    • 2013-04-20
    • 2012-01-22
    • 2013-06-13
    • 2015-09-21
    • 2015-03-18
    相关资源
    最近更新 更多