Kaggle Predict CO2 Emissions in Rwandaの勉強
・やったこと
コードで評価が高かったPSS3E20 EDA which makes sense ⭐️⭐️⭐️⭐️⭐️ | Kaggleを参考にして勉強した。
特にBaseline modelの部分で何をしているか見る。プログラムの解読は下のコードのコメントでしている。
・プログラム
#import import numpy as np import pandas as pd from matplotlib import pyplot as plt import seaborn as sns from sklearn.model_selection import GroupKFold, LeaveOneGroupOut #交差検証 from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error #入力 #index_colでindexとなる列を指定する。 train=pd.read_csv("/kaggle/input/playground-series-s3e20/train.csv",index_col="ID_LAT_LON_YEAR_WEEK") test=pd.read_csv("/kaggle/input/playground-series-s3e20/test.csv",index_col="ID_LAT_LON_YEAR_WEEK") train.head(55) #week_noは週番号。一年の初めから何周目かを表す。 #Baseline model #緯度と経度、年によってのパターンを使う。衛星の情報は使わない。 score_list=[] kf=LeaveOneGroupOut() for fold, (idx_tr, idx_val) in enumerate(kf.split(train, groups=train.year)): #print(fold,idx_tr,idx_val) #foldがindex。year毎に3つのデータ群に行をわけて2つをtrain,testに使う?。0-53が2019年なので #iloc[i][['longitude','latitude','week_no']]でi行目の['longitude','latitude','week_no']列を取得。 X_tr=train.iloc[idx_tr][['longitude','latitude','week_no']] #print(X_tr) y_va=train.iloc[idx_va][['emission']] model=DecisionTreeRegressor() #RadiusNeighborsRegressor(radius=0) model.fit(X_tr,y_tr) y_va_pred=model.predict(X_va) rmse=mean_squared_error(y_va,y_va_pred,squared=False) score_list.append(rmse) print(f"Fold {fold} year {train.iloc[idx_va].year.iloc[0]}: rmse = {rmse:.2f}") #print(train.iloc[idx_va].year) #出力はID_-0.510_29.290_2019_00 2019 、、、とID, yearになる。 rmse=sum(score_list)/len(score_list) print(f"Overall RMSE:{rmse:.2f}")
print(fold,idx_tr,idx_val) は
0 [ 53 54 55 ... 79020 79021 79022] [ 0 1 2 ... 78914 78915 78916]
1 [ 0 1 2 ... 79020 79021 79022] [ 53 54 55 ... 78967 78968 78969]
2 [ 0 1 2 ... 78967 78968 78969] [ 106 107 108 ... 79020 79021 79022]
print(X_tr)は
ID_LAT_LON_YEAR_WEEK longitude latitude week_no ID_-0.510_29.290_2020_00 29.290 -0.510 0 ID_-0.510_29.290_2020_01 29.290 -0.510 1 ID_-0.510_29.290_2020_02 29.290 -0.510 2 ID_-0.510_29.290_2020_03 29.290 -0.510 3 ID_-0.510_29.290_2020_04 29.290 -0.510 4 ID_-0.510_29.290_2020_05 29.290 -0.510 5 . . .
#testデータの'emission'の予測をcsvに出力 model=DecisionTreeRegressor() model.fit(train[['longitude', 'latitude', 'week_no']],train[['emission']]) y_pred=model.predict(test[['longitude', 'latitude', 'week_no']]) #各testの行に対するemissionをlistで持つ。 #print(y_pred) submission_standard=pd.Series(y_pred, name='emission', index=test.index) #indexがtest_indexに対してのy_predのデータを作る。 submission_standard.to_csv('submission_standard.csv') #csvに submission_standard #スコアは33ぐらいらしい。 #Extrapolating the trend #時間発展を考えてないので、時間経過で増えるとすると。 submission_plus5=submission_standard*1.05 #5%増えるとする。 #submission_plus5.to_csv('submission_plus5.csv') #submission_plus5 #Without extrapolation #コロナの影響がある2020の週番号9から2021の週番号8までのデータを削除。 train_nocovid=train[(train.year==2019)| (train.year==2020)&(train.week_no<=8)| (train.year==2021)&(train.week_no>8)] #こっちの方がスコア良い。 #train_nocovid=train[(train.year==2019)| # (train.year==2021)] model=DecisionTreeRegressor() model.fit(train_nocovid[['longitude', 'latitude', 'week_no']],train_nocovid['emission']) y_pred_nocov=model.predict(test[['longitude', 'latitude', 'week_no']]) submission_nocovid=pd.Series(y_pred_nocov,name='emission',index=test.index) submission_nocovid.to_csv('submission_nocovid.csv') submission_nocovid