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