如何为数据框创建线性回归?

4

我正在使用Python构建一个应用程序,可以从数据框中预测Pm2.5污染的值。我正在使用11月份的值,并尝试首先构建线性回归模型。如何在不使用日期的情况下进行线性回归?我只需要预测Pm2.5的值,日期已知。

这是我迄今为止尝试过的:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

data = pd.read_csv("https://raw.githubusercontent.com/iulianastroia/csv_data/master/final_dataframe.csv")
data['day'] = pd.to_datetime(data['day'], dayfirst=True)

#Splitting the dataset into training(70%) and test(30%)
X_train, X_test, y_train, y_test = train_test_split(data['day'], data['pm25'], test_size=0.3,
                                                    random_state=0
                                                    )

#Fitting Linear Regression to the dataset
lin_reg = LinearRegression()
lin_reg.fit(data['day'], data['pm25'])

这段代码会抛出以下错误:

ValueError: Expected 2D array, got 1D array instead:
array=['2019-11-01T00:00:00.000000000' '2019-11-01T00:00:00.000000000'
 '2019-11-01T00:00:00.000000000' ... '2019-11-30T00:00:00.000000000'
 '2019-11-30T00:00:00.000000000' '2019-11-30T00:00:00.000000000'].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

1
尝试按照错误提示重新整理数据。这个回答解决了你的问题吗?Python脚本中的错误“Expected 2D array, got 1D array instead:”? - MattR
1
lin_reg.fit(data[['day']], data['pm25']),注意双括号。 - Quang Hoang
1
为什么不使用X_trainy_train来拟合你的模型呢? - petezurich
2个回答

5

您需要传递 pandas dataframe 而不是 pandas series 作为 X 值,因此您可能想要执行以下操作:

更新:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import datetime

data = pd.read_csv("https://raw.githubusercontent.com/iulianastroia/csv_data/master/final_dataframe.csv")
data['day'] = pd.to_datetime(data['day'], dayfirst=True)

print(data.head())

x_data = data[['day']]
y_data = data['pm25']

#Splitting the dataset into training(70%) and test(30%)
X_train, X_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.3,
                                                    random_state=0
                                                    )
# linear regression does not work on date type of data, convert it into numerical type
X_train['day'] = X_train['day'].map(datetime.datetime.toordinal)
X_test['day'] = X_test['day'].map(datetime.datetime.toordinal)

#Fitting Linear Regression to the dataset
lin_reg = LinearRegression()
lin_reg.fit(X_train[["day"]], y_train)

现在,您可以使用以下内容进行数据预测:
print(lin_reg.predict(X_test[["day"]])) #-->predict the data

如果我使用它,它会抛出这个错误:KeyError:“None of [Index(['day'], dtype ='object')]在[index]中” - moro_92
我认为您想在训练/测试拆分中做相同的事情:将 train_test_split(data['day'], data['pm25'],...) 替换为 train_test_split(data[['day']], data['pm25'],...) - Itamar Mushkin
使用lin_reg.fit(X_train[['day']], y_train['pm25'])会抛出KeyError: 'pm25'错误,因此无法正常工作。 - moro_92
@iulianaiuliana 在 train_test_split 中,你需要传递一个数据框作为 x_data。由于 y_train 已经是代表列 pm25 的 Pandas 系列,因此你不需要调用 y_train["pm25"]。 - Shubham Sharma

1
这就是为什么需要使用“[[”以及如何避免挫败感的原因。data[['day']] 能够正常工作,而 data['day'] 不能是因为 fit 方法期望 X 是一个形状为 (n_samples, n_features) 的元组,但不适用于 Y,请参阅 vignette

fit(self, X, y, sample_weight=None)[source]¶ 拟合线性模型。

参数 X{array-like, sparse matrix} 形状为 (n_samples, n_features) 的训练数据

yarray-like 形状为 (n_samples,) 或 (n_samples, n_targets) 的目标值。将根据需要转换为 X 的 dtype

例如:
data[['day']].shape
(43040, 1)
data['day'].shape
(43040,)
np.resize(data['day'],(len(data['day']),1)).shape
(43040, 1)

这些能够工作是因为它们具备所需的结构:

lin_reg.fit(data[['day']], data['pm25'])
lin_reg.fit(np.resize(data['day'],(len(data['day']),1)), data['pm25'])

虽然这个不会:
lin_reg.fit(data['day'], data['pm25'])

因此,在运行函数之前,请检查您是否以所需格式提供了输入 :)

非常感谢您的解释!您能否检查一下多项式回归是否被正确应用?我想使用70%的训练数据和30%的测试数据,但我不确定我是否正确地处理了这个问题:https://pastebin.com/QzUUkVxh - moro_92

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