SGD Progressor | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

確率的勾配降下法(Stochastic Grandient Descent:SGD) 回帰(Progressor)

注意:事前に説明変数を正規化し、iteration回数を増やしておく点に注意が必要。

説明変数xは13次元

  • CRIM     犯罪発生率
  • ZN        住居区画の密集度
  • INDUS   非小売業の土地割合
  • CHAS    チャールズ川 (1: 川の周辺, 0: それ以外)
  • NOX      NOx 濃度(窒素酸化物)
  • RM       住居の平均部屋数
  • AGE     1940 年より前に建てられた物件の割合
  • DIS       5 つのボストン市の雇用施設からの重み付き距離
  • RAD      大きな道路へのアクセスしやすさ
  • TAX      $10,000 ドルあたりの所得税率
  • PTRATIO     教師あたりの生徒数
  • B          黒人の比率
  • LSTAT  低所得者の割合

 

# ① ライブラリのインポート--------------------------------
import numpy as np #numpyという行列などを扱うライブラリを利用
import pandas as pd #pandasというデータ分析ライブラリを利用
import matplotlib.pyplot as plt #プロット用のライブラリを利用
from sklearn import cross_validation, preprocessing, linear_model #機械学習用のライブラリを利用
import sklearn
sklearn.__version__
 
# ② Housingのデータセットを読み込む--------------------------------
df=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data', header=None, sep='\s+')
df.columns=['CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
 
X_rm=df[['RM']].values
X=df.iloc[:, 0:13]
#X=df[['AGE']].values
Y=df['MEDV'].values
 
'''注意:事前に説明変数を正規化し、iteration回数を増やしておく点に注意が必要。'''
# ③ データの整形(説明変数xの各次元を正規化しておく。(説明変数xの各次元を正規化しておく。)
sc=preprocessing.StandardScaler()
sc.fit(X)
X=sc.transform(X)
sc.fit(X_rm)
X_rm=sc.transform(X_rm)
 
 
# ④ 学習データとテストデータに分割する(8割を学習データとして回帰式を作成し、残り2割で誤差を評価する。)
X_train, X_test, Y_train, Y_test = cross_validation.train_test_split(X, Y, test_size=0.2, random_state=0)
X_rm_train, X_rm_test, Y_train, Y_test = cross_validation.train_test_split(X_rm, Y, test_size=0.2, random_state=0)
 
# ⑤ SGD Regressorを適用する(clf = linear_model.SGDRegressor(max_iter=1000)
clf = linear_model.SGDRegressor(max_iter=1000)
clf.fit(X_train, Y_train)
 
clf_rm = linear_model.SGDRegressor(max_iter=1000)
clf_rm.fit(X_rm_train, Y_train)
 
print("全部使用したときの回帰式の係数")
print(clf.intercept_)
print(clf.coef_)
Y_pred=clf.predict(X_test)
Y_rm_pred=clf_rm.predict(X_rm_test)
print("\n「RMだけの平均2乗誤差」と「全部を使用したときの平均二乗誤差」")
RMS=np.mean((Y_pred - Y_test) ** 2)
RMS_rm=np.mean((Y_rm_pred - Y_test) ** 2)
print(RMS_rm)
print(RMS)
# ⑥ 結果をプロットする(RMだけで回帰した場合の結果をプロット。きちんと回帰分析できているかを目視する。)
line_X=np.arange(-4, 4, 0.1) #3から10まで1刻み
line_Y=clf_rm.predict(line_X[:, np.newaxis])
plt.rcParams["font.size"]= 12
plt.figure(figsize=(10,10))
plt.subplot(2, 1, 1)
plt.scatter(X_rm_train, Y_train, c='c', marker='s')
plt.plot(line_X, line_Y, c='m')
plt.title("RMだけの場合の回帰結果")
plt.xlabel("部屋数")
plt.ylabel("住宅価格")
plt.show
 
# ⑦ 誤差をプロットする(テストデータに対して、回帰式での予測値との誤差を求め、プロット。全部のデータを使用するほうが結果が良い。)
Y_rm_pred=clf_rm.predict(X_rm_test)
plt.rcParams["font.size"]= 12
plt.subplot(2, 1, 2)
plt.scatter(Y_test, Y_rm_pred-Y_test, c='c', marker='s', label="RM_only"
Y_pred=clf.predict(X_test)
plt.scatter(Y_test, Y_pred-Y_test, c='m', marker='s',label="All")
plt.legend()
plt.hlines(y=0, xmin=0, xmax=50, colors='g')
plt.title("RMだけの場合の回帰結果")
plt.xlabel("部屋数")
plt.ylabel("住宅価格")
plt.show
=====================================================================
全部使用したときの回帰式の係数
[22.48302535]
[-1.03219869  1.0546415   0.01984758  0.59924423 -1.88046893  2.61896608
-0.09735359 -2.90625141  2.11170613 -1.86221869 -2.27153809  0.74687485
-3.53343097]

「RMだけの平均2乗誤差」と「全部を使用したときの平均二乗誤差」

RMだけの平均2乗誤差              46.905770028640944
全部を使用したときの平均二乗誤差 33.70129736111494