前提・実現したいこと
私は機械学習初心者です。主にネットからコピペしたりして
RandomForestRegressorで回帰分析のモデルを作ろうとしています。
やりたいこととして
①予測値と正解値の正答率の算出
②予測値の可視化
③特徴重要度の可視化
をしたいと考えています。
①についてはできたのですが②と③についてはできていないのでお力を貸してください。
初心者で勉強不足ですが宜しくお願いします。
追記
②についても解決したかもしれません。
発生している問題・エラーメッセージ
予測値は [ 0.38222 -1.58526 0.34684 ... 2.14196 1.05836 1.01766] と出るのでできれば一つの予測値にしたいです。 追記 #予測値算出 y_pred = rf.predict(X_test) #予測値の平均値 y_pred_true = sum(y_pred)/len(y_pred) print(y_pred) print(y_pred_true) に変更しました。 >[ 0.38222 -1.58526 0.34684 ... 2.14196 1.05836 1.01766] >0.007574019218924746 ------------------------------------------------------------- 特徴重要度の可視化について KeyError: 'feature_names' と出て、できていない状況です。 追記 The above exception was the direct cause of the following exception: Traceback (most recent call last): File "Cモデル名", line 150, in <module> plt.xticks(x, concrete_data['feature_names']) File "C:\Users\Owner\anaconda3\lib\site-packages\pandas\core\frame.py", line 3455, in __getitem__ indexer = self.columns.get_loc(key) File "C:\Users\Owner\anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 3363, in get_loc raise KeyError(key) from err KeyError: 'feature_names'
該当のソースコード
"""ライブラリのインポート"""(追記) #データ解析用ライブラリ import pandas as pd import numpy as np #データ可視化ライブラリ import matplotlib.pyplot as plt import seaborn as sns #RandomForestライブラリ from sklearn.ensemble import RandomForestRegressor as RFR from sklearn.model_selection import GridSearchCV #訓練データとモデル評価用データに分けるライブラリ from sklearn.model_selection import train_test_split #------------------------------------------------------------- #データの読み込み concrete_data = pd.read_csv(r'C:データ',engine='python') print(concrete_data.head())#読み込みの確認 #データを訓練用とモデル評価用に分割 train_set, test_set = train_test_split(concrete_data, test_size=0.2, random_state=4) print(len(train_set)) print(len(test_set)) #データの変数 [A,B,C,D,E,F,G,H,I,J,K,L,M,ID] #訓練データを説明変数データ(X_train)と目的変数データ(y_train)に分割 X_train = train_set.drop(['A','D','E','F','H','L','M','ID'], axis=1) y_train = train_set['M'] #モデル評価用データを説明変数データ(X_train)と目的変数データ(y_train)に分割 # All #X_test = test_set.drop(['A','H','L','M','ID'], axis=1) # Slim X_test = test_set.drop(['A','D','E','F','H','L','M','ID'], axis=1) # non-cyc #X_test = test_set.drop(['A','H','J','K','L','M','ID'], axis=1) y_test = test_set['M'] #分割データの確認 print(X_train.head()) #モデル構築 RandomForest rf = RFR(n_estimators=100, #フォレスト内のツリーの数、デフォルト=100 max_depth=None, #最大深さ無し random_state=2525, #ランダム性、デフォルト=なし bootstrap=True, #ブートストラップ使用 max_leaf_nodes=None, #リーフ、、ノードの数に制限なし min_impurity_decrease=0.0, #ノードの分割、デフォルト=0.0 min_impurity_split=None, #ツリーの成長の早期停止のしきい値 min_samples_leaf=1, #リーフ ノードに必要な最小サンプル数、デフォルト=1 min_samples_split=2, #内部ノードを分割するために必要なサンプルの最小数、デフォルト=2 min_weight_fraction_leaf=0.0, #リーフ ノードに必要なウェイトの合計、デフォルト=0.0 n_jobs=-1, #並列実行するジョブの数 oob_score=False, #袋の外の見積もりを使用して取得したトレーニング データセットのスコア verbose=True, #詳細 warm_start=False) #前の呼び出しの解を再利用、デフォルト=False #モデルフィット rf_train = rf.fit(X_train,y_train) rf_eval = rf.fit(X_test, y_test) params = {'metric': 'rmse', 'max_depth' : 9} #予測値算出 y_pred = rf.predict(X_test) print(y_pred) # feature_importanceを求める feature_importances = rf.feature_importances_ print(feature_importances) plt.figure(figsize=(8, 8)) plt.ylim([0, 1.0]) y = feature_importances x = np.arange(len(y)) plt.bar(x, y, align="center") plt.xticks(x, concrete_data['feature_names']) plt.show()
試したこと
データ読み込みの際にnamesで列名をつけることができると拝見したので、feature_namesを定義して、concrete_data = pd.read_csv(r'C:データ',engine='python',names=feature_names)で読み込んでみましたがだめでした。
そもそもfeature importanceのコードはほぼコピペなので適してるかもわかりません。
②予測値の可視化について、y_predの平均値を取ることで解決したかもしれません。追記します。
補足情報
Spyder(Python3.8)を使っています。
データの分割などは省略しています。
一応、①についてはできているとは思うのですが、モデル自体正しいのか不安です。
![
これが現在出ているグラフです。
理想的にはこのようにy軸に説明変数を出したいです。