2017-09-13 16 views
1

私はKaggleのコンテスト(data here)で作業していますが、scikit-learnのGradientBoostingRegressorの使用に問題があります。競合は、予測を評価するために平均平方根二乗誤差(RMLSE)を使用しています。scitkit-learn.ensemble.GradientBoostingRegressorのルート平均ログ二乗誤差の問題


MWEのために、ここで私は上記のリンクでtrain.csvをきれいにするために使用するコードです:私が使用している場合、を作品に何かを説明するために

import datetime 
import pandas as pd 

train = pd.read_csv("train.csv", index_col=0) 

train.pickup_datetime = pd.to_datetime(train.pickup_datetime) 
train["pickup_month"] = train.pickup_datetime.apply(lambda x: x.month) 
train["pickup_day"] = train.pickup_datetime.apply(lambda x: x.day) 
train["pickup_hour"] = train.pickup_datetime.apply(lambda x: x.hour) 
train["pickup_minute"] = train.pickup_datetime.apply(lambda x: x.minute) 
train["pickup_weekday"] = train.pickup_datetime.apply(lambda x: x.weekday()) 
train = train.drop(["pickup_datetime", "dropoff_datetime"], axis=1) 
train["store_and_fwd_flag"] = pd.get_dummies(train.store_and_fwd_flag, drop_first=True) 

X_train = train.drop("trip_duration", axis=1) 
y_train = train.trip_duration 

は、ランダムフォレストの場合、RMSLEはきちんと計算されます。

import numpy as np 
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor 
from sklearn.metrics import make_scorer 
from sklearn.model_selection import cross_val_score 


def rmsle(predicted, real): 
    sum=0.0 
    for x in range(len(predicted)): 
     p = np.log(predicted[x]+1) 
     r = np.log(real[x]+1) 
     sum = sum + (p - r)**2 
    return (sum/len(predicted))**0.5 

rmsle_score = make_scorer(rmsle, greater_is_better=False) 

rf = RandomForestRegressor(random_state=1839, n_jobs=-1, verbose=2) 
rf_scores = cross_val_score(rf, X_train, y_train, cv=3, scoring=rmsle_score) 
print(np.mean(rf_scores)) 

これはうまく動作します。 しかし、グラジエントブースティングリグレッサーはRuntimeWarning: invalid value encountered in logをスローし、printステートメントからnanを取得します。 3つのRMSLEスコアの配列を見ると、すべてnanです。

gb = GradientBoostingRegressor(verbose=2) 
gbr_scores = cross_val_score(gb, X_train, y_train, cv=3, scoring=rmsle_score) 
print(np.mean(gbr_scores)) 

これは、私がすべきではない場所で負の値をとっているためです。 Kaggle氏は、私の予測をそこにアップロードして自分のコードに関するものかどうかを確認するときに、ゼロまたは非負のRMSLEに遭遇しているとも言いました。グラジエントブースティングがこの問題に使用できない理由はありますか?スコアラー(mse_score = make_scorer(mean_squared_error, greater_is_better=False))としてmean_squared_errorを使用した場合、それは正常に戻ります。

グラディエントブーストの簡単なことが分かりません。なぜこの採点方法はではないのですか?は、グラジエントブースター回帰分析のために働いていますか? make_scorerは、あなたの関数にかかる

+0

(私も主にRのユーザーですので、誰かがコードのPythonの批判を持っている場合あなたが望むならば、一般に、分かち合ってください)。 –

+0

'print(predicted)'を 'rmsle'関数に追加して、予測配列に負の値があるかどうかを調べることができます。Btwの場合、 'rmsle'関数の' for'ループは 'np.sqrt(np.power(np.power(np.array(predicted)+1) - np.log(np.log)と書くことができます。 array(real)+1)、2))) 'これは配列をループするよりも速くなければなりません。 –

+0

@σηγビンゴ、それだけです。ありがとう!また、スコアのベクトル化されたコードにも感謝します。 –

答えて

1

まず構文は次の形式は次のとおりです。

def metric(real,predictions) 

ない

def metric(predictions,real) 

だから、実際のpredictedを得るためにあなたのコード内でreal値を出力する必要があります。あなたの退行者の価値。

次のようにするだけの機能を変更し、それが正常に動作する必要があります

def rmsle(real, predicted): 
    sum=0.0 
    for x in range(len(predicted)): 
     if predicted[x]<0 or real[x]<0: #check for negative values 
      continue 
     p = np.log(predicted[x]+1) 
     r = np.log(real[x]+1) 
     sum = sum + (p - r)**2 
    return (sum/len(predicted))**0.5 

第二に、あなた回帰はありません行のpredcitionで誤った値を与えています。 399937の最初の相互検証済みセット。お役に立てれば !あなたの競争のためのすべてのベスト。

+0

それを明確にしていただきありがとうございます。私はKaggleがそれを投稿した方法であるので、そのまま保管しましたが、私が正しい文書を読んでいたことを知っておいてよかったです。私はR '' ifelse'に慣れています。あなたのコードは基本的にそれが否定的であれば無視すると言いますか? –

関連する問題