Как сделать линейную регрессию для кадра данных? - PullRequest
4 голосов
/ 27 февраля 2020

Я создаю приложение в Python, которое может предсказать значения загрязнения Pm2.5 из кадра данных. Я использую значения за ноябрь и пытаюсь сначала построить модель линейной регрессии. Как я могу сделать линейную регрессию без использования дат? Мне нужны только прогнозы для 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.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2020

Вам нужно передать pandas фрейм данных вместо 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
1 голос
/ 27 февраля 2020

Это просто еще одно добавление к тому, зачем вам нужен "[[", и как избежать разочарования.

Причина, по которой работают данные [['' day ']] и данные [' day '] не означает, что метод fit ожидает для X кортеж 2 с формой, но не для Y, см. виньетка :

fit (self, X, y, sample_weight = None) [источник] ¶ Подходит для линейной модели.

Параметры X {массивоподобная, разреженная матрица} формы (n_samples, n_features) Обучающие данные

yarray-подобная форма (n_samples,) или (n_samples, n_targets) Целевые значения. При необходимости будет приведен к dtype X *

Так, например:

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'])

Поэтому перед запуском функции убедитесь, что вы вводите данные в требуемом формате:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...