Ame*_*dav 6 python-2.7 scikit-learn logistic-regression sklearn-pandas
在将数据集拆分为测试和训练集后,我已在列车集上应用Logistic回归,但我得到了上述错误.我试图解决它,当我试图在控制台中打印我的响应向量y_train时,它会打印整数值,如0或1.但当我将其写入文件时,我发现值是浮点数,如0.0和1.0.如果那就是问题,我怎么能过来呢.
lenreg = LogisticRegression()
print y_train[0:10]
y_train.to_csv(path='ytard.csv')
lenreg.fit(X_train, y_train)
y_pred = lenreg.predict(X_test)
print metics.accuracy_score(y_test, y_pred)
Run Code Online (Sandbox Code Playgroud)
StrackTrace如下,
Traceback (most recent call last):
File "/home/amey/prog/pd.py", line 82, in <module>
lenreg.fit(X_train, y_train)
File "/usr/lib/python2.7/dist-packages/sklearn/linear_model/logistic.py", line 1154, in fit
self.max_iter, self.tol, self.random_state)
File "/usr/lib/python2.7/dist-packages/sklearn/svm/base.py", line 885, in _fit_liblinear
" class: %r" % classes_[0])
ValueError: This solver needs samples of at least 2 classes in the data, but the data contains only one class: 0.0
Run Code Online (Sandbox Code Playgroud)
与此同时,我遇到了无法回答的链接.有解决方案吗?
这里的问题是你的y_train矢量,无论出于何种原因,只有零.它实际上不是你的错,它是一种错误(我认为).分类器需要2个类,否则会抛出此错误.
这说得通.如果你的y_train向量只有零(即只有1个类),那么分类器并不需要做任何工作,因为所有的预测应该只是一个类.
在我看来,分类器应该仍然完成并且只预测一个类(在这种情况下全为零)然后抛出警告,但事实并非如此.它会引发错误.
检查这种情况的方法是这样的:
lenreg = LogisticRegression()
print y_train[0:10]
y_train.to_csv(path='ytard.csv')
if len(np.sum(y_train)) in [len(y_train),0]:
print "all one class"
#do something else
else:
#OK to proceed
lenreg.fit(X_train, y_train)
y_pred = lenreg.predict(X_test)
print metics.accuracy_score(y_test, y_pred)
Run Code Online (Sandbox Code Playgroud)
为了更容易克服这个问题,我建议在测试集中包含更多样本,例如100或1000而不是10.
小智 5
我使用时遇到了同样的问题learning_curve:
train_sizes, train_scores, test_scores = learning_curve(estimator,
X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes,
scoring="f1", random_state=RANDOM_SEED, shuffle=True)
Run Code Online (Sandbox Code Playgroud)
添加suffle将随机化集合的参数。
这并不能防止错误的发生,但它是增加函数使用的子集中两个类的机会的一种方法。