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设置数组元素[重复]

SKLearn ValueError:使用序列设置数组元素

ValueError:在 TFIDF 上训练 KD TRee 时使用序列设置数组元素

ValueError:使用序列设置数组元素(LogisticRegression with Array based feature)

Scikit/Numpy/Pandas ValueError:使用序列设置数组元素

approx_fprime - ValueError:使用序列设置数组元素