我必须创建一个函数,该函数将把我的数据帧同时拆分为测试集和训练集,然后运行最简单的回归模型并返回RMSE。任务是按id和年份预测收入列。
我对这件事还很陌生,我被困在必须拆分测试和训练集的部分,并想办法将所有东西连接在一起。
所需拆分:
- 列车:全部从2021年开始
- 测试:其余年份
数据示例:
df = pd.DataFrame({'year': [2020, 2021, 2021, 2021, 2022],
'id': [3, 1, 1, 2, 1],
'price': [12, 20, 30, 40, 50],
'age': [20, 30, 30, 44, 31],
'product': [book, toy, book, tv, book],
'quantity': [2,1,2,5,9})
到目前为止我的代码:
df['revenue'] = df.price*df.quantity
df['year'] = pd.DatetimeIndex(df['date']).year
#this creates extra variables and puts them the way I need it
def table(df):
df2 = (df.groupby(['year','id'])
.agg(revenue = ('revenue', 'sum'),
age = ('age', 'unique'),
product_year_before = ('product', 'nunique'),
revenue_year_before =('revenue','sum')))
s = df2['product_year_before'].rename(lambda x: x + 1, level=0)
df2 = df2.drop('product_year_before',axis=1).join(s)
s2 = df3['revenue_year_before'].rename(lambda x: x + 1, level=0)
return df3= df3.drop('revenye_year_before',axis=1).join(s2)
table_result = table(df)
table(df)
问题1:我试图以这种方式拆分,但我得到了一个错误"只允许将类似列表的对象传递给isin((,您传递了一个[int]"。有办法解决这个问题吗?
test = df3[df3['year'].isin(2018)]
train = df3[~df3['year'].isin(2018)]
问题2:我如何结合线性回归模型来预测";收入;如果我的结果需要这样:
MSE = np.square(np.subtract(y_actual,y_predicted)).mean()
RMSE = math.sqrt(MSE)
return RMSE
问题1:
如错误消息所述,.isin()
需要一个列表,例如[2017, 2018, 2020]
之类的年份列表。您只传递一个整数2018
。你能做的是:
test = df[df['year'] == 2018]
train = df[df['year'] != 2018]
或者你实际想要的测试数据中的任何一年。
问题2:
不完全确定您的意思,但您可以使用scikit-learn
的LinearRegression函数。使用reg = LinearRegression().fit(X, y)
来拟合回归,其中y
是revenue
列,X
是预测因子。CCD_ 9还具有RMSE计算功能。一起使用以下内容:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
Xtrain = train.drop('revenue', axis = 1).values
ytrain = train.revenue.values.ravel()
Xtest = test.drop('revenue', axis = 1).values
ytest = test.revenue.values.ravel()
reg = LinearRegression().fit(Xtrain, ytrain)
ypred = reg.predict(Xtest)
RMSE = mean_squared_error(ytest, ypred, squared = False)