Sklearn LogisticRegression求解器需要2类数据

Posted

技术标签:

【中文标题】Sklearn LogisticRegression求解器需要2类数据【英文标题】:Sklearn LogisticRegression solver needs 2 classes of data 【发布时间】:2019-07-19 06:48:11 【问题描述】:

我正在尝试通过 sklearn 运行逻辑回归:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import datetime as dt
import pandas as pd
import numpy as np
import talib
import matplotlib.pyplot as plt
import seaborn as sns

col_names = ['dates','prices']
# load dataset
df = pd.read_csv("DJI2.csv", header=None, names=col_names)

df.drop('dates', axis=1, inplace=True)
print(df.shape)
df['3day MA'] = df['prices'].shift(1).rolling(window = 3).mean()
df['10day MA'] = df['prices'].shift(1).rolling(window = 10).mean()
df['30day MA'] = df['prices'].shift(1).rolling(window = 30).mean()
df['Std_dev']= df['prices'].rolling(5).std()
df['RSI'] = talib.RSI(df['prices'].values, timeperiod = 9)
df['Price_Rise'] = np.where(df['prices'].shift(-1) > df['prices'], 1, 0)
df = df.dropna()

xCols = ['3day MA', '10day MA', '30day MA', 'Std_dev', 'RSI', 'prices']
X = df[xCols]
X = X.astype('int')
Y = df['Price_Rise']
Y = Y.astype('int')

logreg = LogisticRegression()

for i in range(len(X)):
   #Without this case below I get: ValueError: Found array with 0 sample(s) (shape=(0, 6)) while a minimum of 1 is required.
    if(i == 0): 
       continue
    logreg.fit(X[:i], Y[:i])

但是,当我尝试运行此代码时,出现以下错误:

ValueError: 
This solver needs samples of at least 2 classes in the data, but the data contains only one class: 58

我的X数据的形状是:(27779, 6) 我的 Y 数据的形状是:(27779,)

这是一个df.head(3) 示例,看看我的数据是什么样的:

     prices    3day MA  10day MA   30day MA   Std_dev        RSI  Price_Rise
30   58.11  57.973333    57.277  55.602333  0.247123  81.932338           1
31   58.42  58.043333    57.480  55.718667  0.213542  84.279674           1
32   58.51  58.216667    57.667  55.774000  0.249139  84.919586           0

我已经尝试搜索我从哪里得到这个问题,但我只找到了thesetwo 的答案,这两个答案都将这个问题作为 sklearn 中的一个错误来讨论,但是它们都是大约两岁,所以我不认为我有同样的问题。

【问题讨论】:

1) 您将 'prices' 变量作为依赖项而不是 'Price_Rise' 这似乎是您的二进制文件。 2)您似乎只用一行数据拟合回归。 3)我怀疑你可能打算在你的 for 循环中使用另一个分组变量,因为 RSI 似乎是一个连续变量。 4) 除非您将其保存到新对象,否则您将在每个循环中覆盖您的拟合。 @BrandonBertelsen 您对二进制数据是正确的,感谢您指出这一点(在我的问题中也进行了上述编辑),但是我仍然遇到同样的错误。就我的循环而言,我正在尝试这样做:1)对于每个元素 'i' 2)在 Y '0' 到 Y 'i' 和 X '0' 到 X 'i' 上拟合逻辑 3)预测Y'i'(还没有添加这个,因为 fit 仍然给出错误) 请注意您已更新,但range(len(X['RSI'])) 仍然会成功,以便您的第一个循环适合一行数据。一排,意味着只有一个班! (0 或 1 - 不是两者!)因此出现错误消息。推荐使用传统的训练/测试拆分来代替这个 for 循环。 在调用合适之前添加一个 assert(len(np.unique(Y[:i])) == 2) 。看看你是否收到错误。 【参考方案1】:

您应该确保在 Y[:i] 中有两个唯一值。所以在你的循环之前,添加如下内容:

starting_i = 0
for i in range(len(X)):
   if np.unique(Y[:i]) == 2:
      starting_i = i

然后在运行主循环之前检查starting_i 不为0。 或者更简单,您可以找到 Y[i] != Y[0] 的第一个匹配项。

【讨论】:

if i in range (0,3): continue 似乎可以解决问题,谢谢 我会搜索starting_i,因此您的解决方案不会依赖于数据。【参考方案2】:
if i in range (0,3): 
    continue

修复了这个问题。 Y[:i] 在 i = 3 之前不是唯一的。

【讨论】:

以上是关于Sklearn LogisticRegression求解器需要2类数据的主要内容,如果未能解决你的问题,请参考以下文章

无法从 sklearn.externals.joblib 导入 Sklearn

sklearn的PCA

sklearn数据库-老鱼学sklearn

使用sklearn画二分类模型ROC曲线,PR曲线

Keras Sklearn Tuner 模块“sklearn”没有属性“管道”

导入sklearn时出现conda sklearn错误