딥 러닝과 기계 학습의 회귀를 실측치와 예측치의 관계 그래프로 비교하고 싶었다.

DeepLearning에서 나오는 그래프는



지금 이 책을 공부하고 있습니다.
이동하면서 배우기 PyTorch 프로그래밍 입문
항상 DeepLearning에서 샘플로 나오는 그래프는 이런 그래프입니다.



Minibatch에서 계산하면 Epoch 횟수와 Loss 데이터로 예측이 잘 작동하는지 여부를 보여주는 그래프가 나옵니다. 이것은 이것으로 좋지만 ....

처음에는 회귀의 샘플 프로그램이 붙어 있습니다만, 여기에서도, 위의 그래프 밖에 나오지 않습니다.scikit-learn 의 기계 학습에서 시작하기 시작한 저는 딥 러닝에서는 실측치와 예측값의 이런 그래프를 왜 쓰지 않을 것이라고 항상 궁금합니다.



같은 그래프로 그리지 않으면 기계 학습과 딥 러닝 회귀의 비교를 시각화 할 수 없습니다.

그렇게 생각했기 때문에, 딥 러닝의 PyTorch 의 공부하면서, 그래프를 그려 보았습니다.

참고로 한 프로그램은



이동하면서 배우기 PyTorch 프로그래밍 입문 의 제3장 「당뇨병의 예후 예측」의 프로그램을 베이스로, 데이터를 보스턴의 집 가격의 데이터 세트로 변경해 사용했습니다.
원래 프로그램은
htps //w w. 오. 이. jp/보오 k/9784274226403/
의 Section3-3.ipynb입니다.

변경점만 아래에 프로그램을 작성합니다.

보스턴 하우스 가격 데이터 세트를 딥 러닝으로 회귀



「이동하면서 배우는 PyTorch 프로그래밍 입문」의 제3장의 당뇨병의 데이터 세트의 딥 러닝 회귀로부터 보스톤의 데이터 세트로 변경하는 변경점은 이하의 곳만입니다.
기본은 diabetesboston로 변경하여 데이터 세트를 변경합니다.
#元のサンプルプログラムの次の部分を変更
#サンプルプログラム
#データセットの読み込み
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()

# データフレームに変換
df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
# 1年後の進行度の追加
df['target'] = diabetes.target

# データセットの可視化
sns.pairplot(df, x_vars=diabetes.feature_names, y_vars='target')
plt.show()

# データセットの読み込み
diabetes = load_diabetes()
data = diabetes.data  # 特徴量
label = diabetes.target.reshape(-1, 1)  # 一年後の糖尿病の進行度

# ハイパーパラメータの定義
D_in = 10  # 入力次元: 10

#上の部分を下記のように変更
#基本的にdiabetes → boston に変更する
#ボストンの家のデータセットへ変更
#データセットの読み込み
from sklearn.datasets import load_boston
boston= load_boston()

# データフレームに変換
df = pd.DataFrame(boston.data, columns=boston.feature_names)
# 1年後の進行度の追加
df['target'] = boston.target

# データセットの読み込み
boston = load_boston()
data = boston.data  # 特徴量
label = boston.target.reshape(-1, 1)  # ボストンの家の価格

# ハイパーパラメータの定義
D_in = 13  # 入力次元: 13


주의점은, 입력의 특징량이, 당뇨병의 데이터 세트가 10에 대해, 보스턴의 집 가격의 데이터 세트가 13이기 때문에, 딥 러닝의 입력의 차원도 변경할 필요가 있는 점이다.

이제 보스톤 데이터 세트에서 회귀 계산을 할 수 있습니다.
계산은 GPU(cuda)로 계산하고 있습니다.
결과는 다음과 같습니다.


정밀도가 현명하지만, 그래프를 그리고 싶을 뿐이므로, 이대로 다음에 갑니다.

보스턴 하우스 데이터 세트에서 랜덤 포리스트 회귀



이것은 간단합니다.scikit-learn 의 계산은 매우 간단하다고 생각합니다.
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
import matplotlib.pyplot as plt

rg = RandomForestRegressor(n_jobs=-1, random_state=0)
rg.fit(train_data,train_label)
test_predict = rg.predict(test_data)
rg_scorer = r2_score(test_label, test_predict)  
print('ランダムフォレストのR2:{:.3g}'.format(rg_scorer))

plt.scatter(test_label, test_predict)
plt.xlabel("measured_value")
plt.ylabel("predict_value")
plt.show()

#ランダムフォレストのR2:0.724




익숙한 그래프를 그렸습니다.

Pytorch의 딥 러닝으로 그래프를 그리려면



포인트는, 예측 결과는, gpu(cuda)로 취급하기 위한 tensor 형식이 되어 있기 때문에, 그것을 cpu로 취급할 수 있는 형식에 되돌려, 한층 더 numpy 로 할 필요가 있습니다. .to('cpu').detach().numpy().copy() 이 부분입니다.
#予測結果のグラフ
import numpy as np
# ディープラーニングを評価モードに設定
net.eval()

#tesonr形式になっているtestデータセットの特徴量データをdevice(gpu:cuda)に送る。
data = test_x.to(device)

#gpuに送ったデータを評価モードのDLで予測する
y_pred = net(data)

#ここでy_predは、gpu(cuda)で計算するtensor形式なので、これをcpuで扱うnumpyに戻す必要がある。
#.to('cpu')で、gpuからcpuモードに戻す
# .detach().numpy().copy()で、tensor形式からnumpy形式に戻して、コピーする
y_pred_cpu = y_pred.to('cpu').detach().numpy().copy()


from sklearn.metrics import r2_score
dl_scorer = r2_score(test_label, y_pred_cpu)  
print('ディープラーニングのR2:{:.3g}'.format(dl_scorer))

#ディープラーニングのR2:0.718
PyTroch 에서 사용하는 데이터는 numpy 에서 tensor 형식으로 변경하여 CPU로 계산할지 GPU로 계산할지에 따라 달라집니다. 예측 결과를 matplotlib 로 그래프로 쓰려면 'tensor' 형식에서 numpy 로 GPU에서 CPU로 되돌려야 합니다.
이것은 한 줄로 쓸 수 있습니다.y_pred_cpu = y_pred.to('cpu').detach().numpy().copy()to('cpu') 에서 gpu에서 cpu 모드로 돌아가기detach().numpy() 에서 numpy 형식으로 되돌립니다.
numpy 로 돌아오면 나중에 랜덤 포리스트 결과와 딥 러닝 결과를 함께 그래프로 만드십시오.

DeepLearning과 RandomForest의 결과 비교




Pytorch 의 딥 러닝의 설정이 적당하기 때문에, 그다지 정밀도는 좋지 않습니다만, 이것으로 랜덤 포레스트와 딥 러닝의 비교의 가시화를 할 수 있었습니다.

좋은 웹페이지 즐겨찾기