【问题标题】:How to make a linear regression for a dataframe?如何对数据框进行线性回归?
【发布时间】:2020-06-11 12:07:01
【问题描述】:

我正在用 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.

【问题讨论】:

标签: python pandas regression


【解决方案1】:

对于X 值,您需要传递 pandas dataframe 而不是 pandas series,因此您可能想要做这样的事情,

更新:

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')] are in the [index]"
  • 我认为您想在训练/测试拆分中做同样的事情:将 train_test_split(data['day'], data['pm25'],...) 替换为 train_test_split(data[['day']], data['pm25'],...)
  • 使用 lin_reg.fit(X_train[['day']], y_train['pm25']) 会抛出错误 KeyError: 'pm25',所以它不起作用
  • @iulianaiuliana 你必须在train_test_split 中为你的x_data 传递一个数据框。由于y_train 已经是代表pm25 列的熊猫系列,因此您不必调用 y_train["pm25"]。
【解决方案2】:

这只是添加到您为什么需要“[[”以及如何避免挫败感的其他内容。

data[['day']] 有效而 data['day'] 无效的原因是 fit 方法期望 X 的元组为 2 的形状,而不是 Y,请参阅vignette

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

参数 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% 的测试数据,但我不确定我是否正确管理:pastebin.com/QzUUkVxh
猜你喜欢
  • 2013-10-23
  • 1970-01-01
  • 2020-11-01
  • 2010-12-20
  • 2019-07-07
  • 2017-02-04
  • 2022-01-11
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多