Python Sklearn Logistic回归解算器需要两类数据

Python Sklearn Logistic回归解算器需要两类数据,python,scikit-learn,Python,Scikit Learn,我正在尝试通过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.pyp

我正在尝试通过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

我试着从自己那里寻找这个问题的答案,但我只找到了答案,这两个答案都将这个问题作为sklearn中的一个bug来讨论,但是他们都大约有两年了,所以我不认为我有相同的问题

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

starting_i = 0
for i in range(len(X)):
   if np.unique(Y[:i]) == 2:
      starting_i = i
然后在运行主循环之前,只需检查start_i不是0。 或者更简单,您可以找到第一个出现在Y[i]!=Y[0]

if i in range (0,3): 
    continue

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

1)您将“价格”变量作为因变量传递,而不是“价格上涨”,后者似乎是您的二进制变量。2) 您似乎只使用一行数据拟合回归。3) 我怀疑您可能打算在for循环中使用另一个分组变量,因为RSI似乎是一个连续变量。4)除非将其保存到新对象,否则您将覆盖每个循环的拟合。@BrandonBertelsen关于二进制数据的说法是对的,感谢您指出这一点(在我的问题中也进行了上述编辑),然而,我仍然得到相同的错误。就我的循环而言,我正在尝试这样做:1)对于每个元素“I”2)在Y“0”到Y“I”和X“0”到X“I”之间拟合逻辑3)预测Y“I”(由于拟合仍会出错,尚未添加此项),请注意您已更新,但仍
范围(len(X['RSI'))
将使您的第一个循环符合一行数据。一排,就意味着只有一个班级!(0或1-不是两者都有!)因此出现错误消息。建议使用传统的训练/测试分割来代替这个for循环。在调用fit之前添加一个assert(len(np.unique(Y[:i])==2)。查看是否出现错误。如果i在范围(0,3)内:继续似乎可以解决问题,谢谢。我将搜索起始i,这样您的解决方案就不会依赖于数据。