2016-12-23 122 views
0

私は現在、変数と観測値を持つデータセットを持っています。私は変数(需要)を予測したいが、これは連続的なものなので、回帰モデルを使う必要がある。私はLinear Regressionで試して、R2メトリックを使って評価しました。これは約0.85でした。他のモデルとのパフォーマンスを評価したいと思っていましたが、そのうちの1つはNNsでした。私はニューラルネットワークが分類のような他のタスクにもっと適していると信じていますが、それでも私はそれらに試してみたいです。MLPRegressorのチューニング方法は?

scikit-learnは、線形回帰とマルチレイヤパーセプトロンの両方を提供しているため、R2メトリックが線形回帰のものに比べて遠すぎて悪いものでした。したがって、私は多くの重要な構成が欠けていると結論づけました。下に私のコードとデータの仕方を見ることができます。

私のデータは、以下の列があり、唯一のdemand(私のラベルである)、​​、gdpdayyearは、残りの連続数値ですカテゴリです。

['demand','holy','gdp','population', 'day','year', 'f0', 'f1', 'f2', 'f3', 'f4','f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'g0', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'g9', 'g10', 'g11'] 

これは実際に行っていることですが、出力を一部削除しました。

import pandas as pd 
import numpy as np 
import math as math 

from sklearn.linear_model import LinearRegression 
from sklearn.neural_network import MLPRegressor 
from sklearn.metrics import r2_score 



training_data, validation_data = np.split(data.sample(frac=1), [int(.8*len(data))]) 

linear_model = LinearRegression().fit(training_data[[c for c in data.columns if c != "demand"]], training_data[["demand"]]) 

validation_data_predictions = linear_model.predict(validation_data[[c for c in training_data.columns if c != "demand"]]) 

validation_predictions_pd = pd.DataFrame(data=validation_data_predictions, 
             index=validation_data.index.values, 
             columns=["prediction"]) 

# join both pandas 
result_df = validation_data.join(validation_predictions_pd, how="inner") 

r2_error = r2_score(y_true=result_df[["demand"]], y_pred=result_df[["prediction"]], multioutput="uniform_average") 

print(r2_error) # outputs 0.85 


# NN section 
clf = MLPRegressor(hidden_layer_sizes=(10,), max_iter=100000) 

neural_model = clf.fit(training_data[[c for c in training_data.columns if c != "demand"]], training_data[["demand"]]) 

validation_data_predictions = neural_model.predict(validation_data[[c for c in training_data.columns if c != "demand"]]) 

validation_predictions_pd = pd.DataFrame(data=validation_data_predictions, 
            index=validation_data.index.values, 
            columns=["prediction"]) 

result_df = validation_data.join(validation_predictions_pd, how="inner") 

r2_error = r2_score(y_true=result_df[["demand"]], y_pred=result_df[["prediction"]], multioutput="uniform_average") 
print(r2_error) # outputs 0.23 

NNのパフォーマンスは非常に低いです。そして、私はそのパフォーマンスが改善されると思います、何かヒント?

+0

アルベルト、あなたがしてください可能性がありあなたの例は再現性がありますか? 'data'変数を定義して、他の人があなたに具体的な助けを提供できるようにしてください。乾杯! –

答えて

0

おそらく、NNのパフォーマンスが悪いとは限りません。多分、それらを比較するために間違った指標を使用しているだけかもしれません。通常、多くの回帰分析を伴う線形回帰モデルを評価するためにR2スコアを信頼するのは良い考えではありません。実際には、回帰式が多いほどRの二乗(see this video for a quick explanation)が高くなります。

はとにかく私はこの質問はhttps://stats.stackexchange.com/

1
  1. MLPは、機能のスケーリングに敏感であるため、より適切だと思います。あなたのデータを正常化しましたか?

  2. ネットワーク構造を変更します。より多くの隠れ層と各層SIGMOD/TANH/reluへ

  3. 変更活性化機能のパーセプトロンの変更番号を追加するなど