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