高效地将数据框作为 y 和 X 传递给 scikit-learn 模型训练

7

我使用read_sql_query从数据库中生成了一个pandas数据帧。它有三列,“results,speed,weight”。

我想使用scikit-learn LinearRegression来拟合results = f(speed, weight)

我尚未找到正确的语法,可以使我传递这个数据框或其列切片到LinearRegression.fit(y, X)

print df['result'].shape
print df[['speed', 'weight']].shape
(8L,)
(8, 2)

但我无法将它传递给 fit
lm.fit(df['result'], df[['speed', 'weight']])

它会抛出一个“弃用警告(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]

如何高效、清晰地将目标和特征的数据框传递给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)

df['result'].values sometimes you need df.iloc[:, :-1] - Shihe Zhang
4个回答

9

您发送的值顺序不正确。所有实现fit()的scikit-learn估算器都接受输入X,y而不是您所做的y,X。

请尝试以下操作:

lm.fit(df[['speed', 'weight']], df['result'])

5
首先,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()

要将 y 从形状 (5,1) 转换为形状 (5,),您需要使用 .squeeze()。这将给出正确的形状,希望程序能够运行!


4

有更好的方法整合pandas和sklearn,但其中一个可能会阻止你按照你目前的方式进行操作,那就是y结果列的形状。它是1D,但需要是2D。

@Valentin Calomme提到了这一点,但我喜欢用添加额外方括号的方式将其变为2D,而不是使用squeeze()

df['results']是1D,但df[['results']]是2D,数据是相同的。

df['results'].shape
# Out: (8,)
### 1D array

df[['results']].shape
# Out: (8, 1)
### 2D array

关于参数的顺序,只有当您不使用参数名称时才会有影响。我习惯查阅文档并始终明确使用参数名称,以避免错误地排列参数,并在现在和以后再次使用时更好地了解自己正在做什么,因为我担心开发人员会搞乱参数顺序哈哈。
lm.fit(y=df[['result']], X=df[['speed', 'weight']])

### works just as well as

lm.fit(X=df[['speed', 'weight']], y=df[['result']])

0
请使用以下代码:
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from sklearn.linear_model import LinearRegression

lm = LinearRegression() 
predefinedFeatureList = ["speed","weight"]
target = "result"

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)
#results = df['result']
#df.drop(['result'],axis= 1,inplace = True)
lm.fit(df[predefinedFeatureList],df[target]) #LM Fit takes arguments as (X,Y,sample_weights(optional))

我希望避免将数据分割成不同的数据框,并且拥有一个包含许多特征的大型数据框,但只传递其中几个特征到拟合函数中。 - user3556757
你可以通过使用它们的索引来选择列。 - Bhushan Pant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接