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()
这将为您提供正确的形状,并希望程序能够运行!
您以错误的顺序发送值。所有实现 fit() 的 scikit-learn 估计器都接受输入 X, y not y, X 正如你所做的那样。
尝试这个:
lm.fit(df[['speed', 'weight']], df['result'])
Run Code Online (Sandbox Code Playgroud)