確率的勾配降下法(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_)
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])
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.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
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.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
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
[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

