有效地将数据帧作为 y 和 X 传递给 scikit-learn fits

use*_*757 4 python pandas scikit-learn

我从read_sql_query. 它有三栏,“结果,速度,重量”

我想用 scikit-learnLinearRegression来适应results = f(speed, weight)

我一直无法找到正确的语法来允许我将此数据框或其列切片传递给LinearRegression.fit(y, X).

print df['result'].shape
print df[['speed', 'weight']].shape
(8L,)
(8, 2)
Run Code Online (Sandbox Code Playgroud)

但我不能把它传递给 fit

lm.fit(df['result'], df[['speed', 'weight']])
Run Code Online (Sandbox Code Playgroud)

它抛出一个deprecation warning和一个ValueError

DeprecationWarning: Passing 1d arrays as data is deprecated in 0.17 and willraise ValueError in 0.19. 
ValueError: Found arrays with inconsistent numbers of samples: [1 8]
Run Code Online (Sandbox Code Playgroud)

获取目标和特征的数据帧并将它们传递给fit操作的有效、干净的方法是什么?

这就是我生成示例的方式:

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

date_today = datetime.now()
days = pd.date_range(date_today, date_today + timedelta(7), freq='D')

np.random.seed(seed=1111)
data = np.random.randint(1, high=100, size=len(days))
data2 = np.random.randint(1, high=100, size=len(days))
data3 = np.random.randint(1, high=100, size=len(days))
df = pd.DataFrame({'test': days, 'result': data,'speed': data2,'weight': data3})
df = df.set_index('test')
print(df)
Run Code Online (Sandbox Code Playgroud)

小智 6

首先,fit() 接受 X, y 而不是 y, X。

其次,重要的是要记住,Scikit-Learn 只适用于类似数组的对象。它期望 X 具有形状 (n_samples, n_features) 并且 y 具有形状 (n_samples,)

当你使用 fit 时,它会检查这些形状,所以如果你的 X、y 不遵守这些规则,它就会崩溃。好消息,X 已经具有形状 (5,2),但 y 将具有形状 (5, 1),这与 (5,) 不同,因此您的程序可能会崩溃。

为了安全起见,我只是从一开始就将 X 和 y 转换为 numpy 数组。

X = pd.DataFrame(np.ones((5, 2)))
y = pd.DataFrame(np.ones((5,)))

X = np.array(X)
y = np.array(y).squeeze()
Run Code Online (Sandbox Code Playgroud)

为了使 y 从形状 (5,1) 变为形状 (5,),您需要使用.squeeze() 这将为您提供正确的形状,并希望程序能够运行!


Viv*_*mar 5

您以错误的顺序发送值。所有实现 fit() 的 scikit-learn 估计器都接受输入 X, y not y, X 正如你所做的那样。

尝试这个:

lm.fit(df[['speed', 'weight']], df['result'])
Run Code Online (Sandbox Code Playgroud)