用于预测一年内操作次数的最佳机器学习算法是什么?
What is the best machine learning algorithm to use for predicting number of operations across a year?
我有一个包含两列的数据框,第一列是一系列日期,第二列是 2019 年完成的操作数。我想应用 ML 来预测 2020 年的操作数。
在将日期转换为 'int64' 后,我尝试使用 Sklearn LinearRegression 进行预测,但预测值与我的预期相差太远,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
你的做法是完全错误的。您使用机器学习来训练适合一组“features" and it's respective "values" or "labels”的模型。
在您的情况下,您将日期视为一项功能,而这正是您出错的地方!
日期不是地图项。日期不是一个现象的特征(操作次数)。
您选择的"value"/"label"是"number of operations"。那里没有问题。
在你开始修复代码中的错误之前,纠正你对机器学习的理解。
此问题陈述需要考虑的事项:
在您的数据集中,您可能有一些 "variables"(即 "features")会影响您的操作数量,例如天气。在下雨天,你的操作数可能会下降,在晴天,操作数可能会很高(我不知道你的意思"operations",但这只是我举的例子)。因此,天气将是您可以在模型训练中使用的 "feature"。现在可能不止一个 "feature"(甚至可能高达一百万,这取决于您的数据集)。
找出数据集中所有可能的特征,然后选择合适的技术,如线性回归、聚类、SVM 等。
祝您学习愉快! :)
我有一个包含两列的数据框,第一列是一系列日期,第二列是 2019 年完成的操作数。我想应用 ML 来预测 2020 年的操作数。
在将日期转换为 'int64' 后,我尝试使用 Sklearn LinearRegression 进行预测,但预测值与我的预期相差太远,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
你的做法是完全错误的。您使用机器学习来训练适合一组“features" and it's respective "values" or "labels”的模型。
在您的情况下,您将日期视为一项功能,而这正是您出错的地方!
日期不是地图项。日期不是一个现象的特征(操作次数)。
您选择的"value"/"label"是"number of operations"。那里没有问题。
在你开始修复代码中的错误之前,纠正你对机器学习的理解。
此问题陈述需要考虑的事项:
在您的数据集中,您可能有一些 "variables"(即 "features")会影响您的操作数量,例如天气。在下雨天,你的操作数可能会下降,在晴天,操作数可能会很高(我不知道你的意思"operations",但这只是我举的例子)。因此,天气将是您可以在模型训练中使用的 "feature"。现在可能不止一个 "feature"(甚至可能高达一百万,这取决于您的数据集)。
找出数据集中所有可能的特征,然后选择合适的技术,如线性回归、聚类、SVM 等。
祝您学习愉快! :)