ValueError:使用序列设置数组元素(LogisticRegression with Array based feature)
Posted
技术标签:
【中文标题】ValueError:使用序列设置数组元素(LogisticRegression with Array based feature)【英文标题】:ValueError: setting an array element with a sequence (LogisticRegression with Array based feature) 【发布时间】:2017-05-01 14:23:30 【问题描述】:提前感谢您的任何指导。我正在尝试使用 scikit-learn 通过 Logistic 回归进行分类,其中 X 是 Intercept,一个字段是一组称为 heartrate 的心率数据。根据对同样遇到此错误的其他人的研究,我确保心率数组的形状/大小都相同。
它在 sklearn/utils/validation.py 第 382 行中出现值错误,在 check_array 中的数据帧副本通过 array = np.array(array, dtype=dtype, order=order, copy =复制)。我怀疑我的数组在内存中不连续,这就是问题所在,但不确定......
这里有一些代码片段可以帮助找出问题:
def get_training_set(self):
training_set = []
after_date = datetime.utcnow() - timedelta(weeks=8)
before_date = datetime.utcnow() - timedelta(hours=12)
activities = self.strava_client.get_activities(after=after_date, before=before_date)
for act in activities:
if act.has_heartrate:
streams = self.strava_client.get_activity_streams(activity_id=act.id, types=['heartrate'])
heartrate = np.array(list(filter(lambda x: x is not None, streams['heartrate'].data)))
fixed_heartrate = np.pad(heartrate, (0, 15000 - len(heartrate)), 'constant')
item = 'activity_type': self.classes.index(act.type),'heartrate': fixed_heartrate
training_set.append(item)
return pd.DataFrame(training_set)
def train(self):
df = self.get_training_set()
df['Intercept'] = np.ones((len(df),))
y = df[['activity_type']]
X = df[['Intercept', 'heartrate']]
y = np.ravel(y)
#
model = LogisticRegression()
self.debug('y='.format(y))
model = model.fit(X,y)
异常发生在fit...
提前感谢您的任何指导。
尊重,
迈克
从评论中复制以改进格式:
/python3.5/site-packages/sklearn/linear_model/logistic.py", line 1173, in
fit order="C")
File "/python3.5/site-packages/sklearn/utils/validation.py", line 521, in
check_X_y ensure_min_features, warn_on_dtype, estimator)
File "/lib/python3.5/site-packages/sklearn/utils/validation.py", line 382, in
check_array array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence
还有其他评论:
X 和 y 看起来像这样:
X.shape=(29, 2)
y.shape=(29,)
X=[[1 array([74, 74, 77, ..., 0, 0, 0])]
[1 array([66, 67, 69, ..., 0, 0, 0])]
...
[1 array([92, 92, 91, ..., 0, 0, 0])]
[1 array([79, 79, 79, ..., 0, 0, 0])]]
y=[ 0 11 11 0 1 0 11 0 11 1 0 11 0 0 11 0 0 0 0 0 11 0 11 0 0 0 11 0 0]
【问题讨论】:
问题是在fit
你做......?????编辑您的问题,以便提供有关错误及其位置的真实和清晰的信息。如果错误不是很明显,我们将需要足够的信息来自己重现问题。
模型的拟合函数出现错误。堆栈如下:“/python3.5/site-packages/sklearn/linear_model/logistic.py”,第 1173 行,in fit order="C") 文件“/python3.5/site-packages/sklearn/utils/validation .py”,第 521 行,在 check_X_y ensure_min_features,warn_on_dtype,估计器)文件“/lib/python3.5/site-packages/sklearn/utils/validation.py”,第 382 行,在 check_array 中 array = np.array(array, dtype=dtype, order=order, copy=copy) ValueError: setting an array element with a sequence.
所以X
是一个 dtype=object 的 (29,2) 数组,其中一个元素(第 2 列)本身就是一个数组。无需深入细节,我就能明白为什么它会抱怨“带有序列的设置”——序列就是数组。整个数组应该是一个“特征”,还是数组的每个元素都是一个单独的特征?
@hpauji,我的意图是使用一个特征来表示所有的心率数据。所以是的,该功能是一个整数数组。另一个 *** SME 建议 scikit-learn 无法处理基于数组的特征,因此我将心率数据移至单个特征 heartrate_1-15K 特征。算法现在效果很好,但它不是最佳恕我直言,因为我想轻松地做 PCA 等事情......
【参考方案1】:
如果你把 train() 改成这样,效果会更好吗?
def train(self):
df = self.get_training_set()
df['Intercept'] = 1 # (a)
y = df['activity_type'].values # (b)
X = [np.concatenate(( np.array([col1]), col2 )) for col1, col2 in df[['Intercept', 'heartrate']].values.T]
model = LogisticRegression()
model.fit(X,y) # (c)
(a) 将生成正确长度的序列 (b) 使用值返回一个 numpy 数组而不是另一个数据帧 (c) 适合就地完成
【讨论】:
感谢您的帮助。在 fit 函数中得到相同的错误。 check_array 中的值错误。 X 和 y 看起来像这样: X.shape=(29, 2) y.shape=(29,) X=[[1 array([74, 74, 77, ..., 0, 0, 0])] [1 数组([66, 67, 69, ..., 0, 0, 0])] ... [1 数组([92, 92, 91, ..., 0, 0, 0])] [ 1个数组([79, 79, 79, ..., 0, 0, 0])]] y=[ 0 11 11 0 1 0 11 0 11 1 0 11 0 0 11 0 0 0 0 0 11 0 11 0 0 0 11 0 0] 单个特征可以是向量数组还是整行都需要是一个数组?我第一次将数组用于功能...:) 这是一个问题 - scikit learn 无法处理数组特征。您应该将数组的每个元素包含在单独的列中。这确实应该在数据帧级别完成,但我在答案中包含了一个临时解决方案 啊哈!优秀。我将修复 get_training_set 并查看是否可以使其正常工作。顺便说一句,感谢指导! 现在就像一个魅力!不得不考虑如何在不影响性能的情况下处理 15K 列,但这还不错。再次感谢您的指导。顺便说一句,仅 scikit-learn 无法处理数组吗?似乎张量是定义数组,所以也许这样做更容易?我问的原因是理想情况下,我可以做 PCA 之类的事情,看看“心率”或其他流类型特征(例如功率)是否有影响,而不是一小时内的第三次阅读有影响......以上是关于ValueError:使用序列设置数组元素(LogisticRegression with Array based feature)的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:使用序列python,numpy设置数组元素[重复]
ValueError:在 TFIDF 上训练 KD TRee 时使用序列设置数组元素
ValueError:使用序列设置数组元素(LogisticRegression with Array based feature)