Какой алгоритм машинного обучения лучше всего использовать для прогнозирования количества операций в год? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть фрейм данных из двух столбцов, первый - это ряд дат, а второй - количество операций, выполненных в 2019 году. Я хочу применить ML для прогнозирования количества операций в 2020 году.

Я пытался использовать Sklearn LinearRegression для прогнозирования после преобразования дат в 'int64', но прогнозируемые значения слишком далеки от ожидаемых для меня, и значение coef_ равно -3

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.externals import joblib
from sklearn import metrics
import datetime
df= pd.read_csv(r'...surgical_clean.csv')
df= pd.to_datetime(df['pd_date_of_operation']).value_counts().to_frame().reset_index()
year_start = np.datetime64(pd.to_datetime(2017, format= '%Y'))
df= df[(df['index'] >= year_start)].astype('int64')
x= df.iloc[:,:-1].values
y= df.iloc[:,1].values
x_train,x_test,y_train,y_test= train_test_split(x,y, test_size=0.2, random_state=0) 
regressor= LinearRegression()
model= regressor.fit(x_train,y_train)  
y_pred= model.predict(x_test).round(0)
>>>array([4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4., 4.,
       4., 4., 4., 4., 4., 4.])
print(model.coef_)
print(model.intercept_)
>>>[-3.81638905e-18]
9.546358714910848
from sklearn import metrics
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred).round(1))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred).round(1))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)).round(1))
>>>Mean Absolute Error: 1.1
Mean Squared Error: 2.4
Root Mean Squared Error: 1.5
predict = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
predict.sum()
>>>Actual       589.0
Predicted    636.0
dtype: float64

1 Ответ

0 голосов
/ 11 ноября 2019

Ваш подход совершенно неверен. Вы используете машинное обучение для обучения модели, которая соответствует набору « функций » и соответствующих ему «значений» или « меток ».

В вашем случае вашрассматривают дату как особенность, и именно здесь вы ошиблись!

Дата не является функцией. Дата не является характеристикой явления (количество операций).

Вы выбираете «значение» / «метка» как «количество операций». Никаких проблем там нет.

Перед тем, как приступить к исправлению ошибок в коде, исправьте свое понимание машинного обучения.

Что следует учесть при формулировке этой проблемы:

В вашем наборе данных вы можете иметьнекоторые «переменные» (то есть «особенности»), которые влияют на количество ваших операций, таких как погода. В дождливый день количество ваших операций может снизиться, в солнечный день количество операций может быть высоким (я не знаю, что вы подразумеваете под «операциями», но это только пример, который я привожу). Таким образом, погода будет «особенностью», которую вы можете использовать при обучении модели. Теперь может существовать более одной «функции» (может быть, даже до миллиона, которая будет зависеть от вашего набора данных).

Узнайте все возможные функции в вашем наборе данных, а затем выберите, какая техника будет правильной, например, линейная регрессия, кластеризация, SVM и т. Д.

Счастливого обучения! :)

...