「スッキリわかる Pythonによる機械学習入門」という書籍で学んだことをスクリプトと合わせてまとめていきます。
分類・回帰における使用データは、サンプルデータとして有名な下記の2つを想定しています。
- 分類:アヤメの花に関するデータ(iris.csv)
- 回帰:ボストン市の地区に関するデータ(Boston.csv)
データ処理
データフレームの作成
import pandas as pd
# irisファイルを読み込んで、データフレームに変換
df = pd.read_csv('iris.csv')
データ加工
学習データとテストデータの分割(ホールドアウト法)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, t, test_size = 0.3, random_state = 0)
#x_train,y_trainが学習に利用するデータ
#x_test,y_testが検証に利用するテストデータ
データの標準化
標準化すると平均値:0、標準偏差:1の分布となる
from sklearn.preprocessing import StandardScaler
sc_model_x = StandardScaler()
# 各列のデータを標準化してsc_xに代入
sc_x = sc_model_x.fit_transform(x_train)
# 正解データも同様に
sc_model_y = StandardScaler()
sc_y = sc_model_y.fit_transform(y_train)
ダミー変数化(ワンホットエンコーディング)
カテゴリごとに新たな列を作成し、そのカテゴリに属すれば1、属さなければ0を付与する
column = pd.get_dummies(df['column'], drop_first = True)
累乗列と交互作用特徴量の一括追加
既存のすべての特徴量に対して、累乗列と交互作用特徴量を作成する
from sklearn.preprocessing import PolynomialFeatures
pf = PolynomialFeatures(degree = 2, include_bias = False) #degreeで何乗までかを指定
pf_x = pf.fit_transform(sc_x) # 2乗列と交互作用項の追加
pf.get_feature_names() #列名の確認
機械学習(教師あり)
分類
決定木
予測するための分岐条件を定め、フローチャート化する
分岐条件の決定には、各分岐条件の不純度のなかからもっとも小さい分岐条件が採用される
from sklearn import tree
model = tree.DecisionTreeClassifier(max_depth = 2, random_state=0, class_weight ='balanced')
#max_depthは最大の木の深さ
#class_weightは正解データが不均衡データの場合に必要
# 訓練データで学習
model.fit(x_train, y_train)
# テストデータの予測結果と実際の結果が合致する正解率を計算
model.score(x_test, y_test)
# 決定木の描画
x_train.columns = ['gaku_nagasa', 'gaku_haba', 'kaben_nagasa','kaben_haba']
# plot_tree関数で決定木を描画
from sklearn.tree import plot_tree
plot_tree(model, feature_names = x_train.columns, filled = True)
ランダムフォレスト
たくさんの決定木を作成し、それぞれの木の予測結果の多数決で最終結果を求める手法。アンサンブル学習の1つ。
from sklearn.ensemble import RandomForestClassifier
x_train, x_test, y_train, y_test=train_test_split(x, t, test_size = 0.2, random_state = 0)
model = RandomForestClassifier(n_estimators = 200, random_state = 0)
model.fit(x_train, y_train)
アダブースト
大量のモデルを生成し、1つずつ順番に学習させていく。
各モデルは前のモデルの学習結果を共有して学習する。
予測は、各モデルの予測性能に応じた重み付き多数決を行う。
from sklearn.ensemble import AdaBoostClassifier
# ベースとなるモデル
from sklearn.tree import DecisionTreeClassifier
# 最大の深さ5の決定木を何個も作っていく
base_model = DecisionTreeClassifier(random_state = 0,
max_depth = 5)
# 決定木を500個作成
model = AdaBoostClassifier(n_estimators = 500, random_state = 0, base_estimator = base_model)
model.fit(x_train,y_train)
ロジスティック回帰
分類のための確率を予測する
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(C = 0.1,random_state=0, multi_class = 'auto', solver = 'lbfgs')
#Cは正則化項の定数
model.fit(x_train, y_train)
回帰
線形回帰
連続値である正解データを予測するための回帰式を作成する
回帰式の係数には、予測値と実際の値の誤差(平均2乗誤差)が最小となるものが学習によって選ばれる
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(sc_x, sc_y)
リッジ回帰(L2正則化)
連続値である正解データを予測するための回帰式を作成する
係数(係数の2乗の合計)をできるだけ小さくしつつ、予測値と実際の値の誤差(平均2乗誤差)が最小となるものが学習によって選ばれる
from sklearn.linear_model import Ridge
ridgeModel = Ridge(alpha = 10) #alphaは正規化項につく定数
ridgeModel.fit(x_train, y_train)
alphaを大きくすると過学習防止効果が強くなるが、大きくしすぎると予測性能が低下する。
ラッソ回帰(L1正則化)
連続値である正解データを予測するための回帰式を作成する
係数(係数の絶対値の合計)をできるだけ小さくしつつ、予測値と実際の値の誤差(平均2乗誤差)が最小となるものが学習によって選ばれる
from sklearn.linear_model import Lasso
model = Lasso(alpha = 0.1) #alphaは正規化項につく定数
model.fit(x_train, y_train)
回帰木
回帰のためのフローチャートを作成する
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(max_depth = 10, random_state = 0)
model.fit(x_train, y_train)
model.score(x_test, y_test) # テストデータでの決定係数
#特徴量の重要度
model.feature_importances_
機械学習(教師なし)
主成分分析
次元削減手法の1つ
元のデータを移したときに分散が大きくなるような新しい列(軸)を作成する
元のデータの情報が新しい列(軸)に対してどの程度寄与しているかを、寄与率で判断できる
from sklearn.decomposition import PCA
model = PCA(n_components = 2, whiten = True) #n_componentsは固有ベクトル、whitenは白色化
model.fit(sc_df)
model.explained_variance_ratio_ # 寄与率
#データをモデルに与えて新しい列を作成
new = model.transform(sc_df)
new_df = pd.DataFrame(new)
#累積寄与率のグラフ化
ratio = model.explained_variance_ratio_ # 寄与率のデータ集合
array = [] # 第N列までの累積寄与率を格納するリスト
for i in range(len(ratio)):
# 累積寄与率の計算
ruiseki = sum(ratio[0:(i+1)])
array.append(ruiseki) # 累積寄与率の格納
# 第N列の累積寄与率を折れ線グラフ化
pd.Series(array).plot(kind = 'line')
K-means法
クラスタリング手法の1つ
クラスタの数を指定し、データ間の座標の距離が近いもの同士をまとめてクラスタに分けていく
最適なクラスタ数は、エルボー法により決定することができる
from sklearn.cluster import KMeans
model = KMeans(n_clusters = 3, random_state = 0)
model.fit(sc_df)
model.labels_ #クラスタリング結果
モデル保存
import pickle
with open('irismodel.pkl', 'wb') as f:
pickle.dump(model, f)
コメント