<ほぼコードのみ>(機械学習入門-python)pythonで教師あり学習(予測・分類)をしてみたい人へ(初心者向け)

機械学習入門

「機械学習ってなに?」「何から始めればいい?」といったお悩みを解決できるかもしれない記事になっています。

この記事はpythonの環境は作れたけど、機械学習やってみたいなぁ、という人向けです。

量的変数である、離散的なデータと連続的なデータなどを理解してから読んだ方がわかりやすいと思いますので、

を読んでからですと定着しやすいかもです!

機械学習とは

必要なライブラリ

  • sklearn
  • numpy
  • pandas
  • featuretools

目的変数が量的変数である回帰(regression)予測

例として、カリフォルニア住宅価格予測のデータセットをもちいて予測してみます。

#scikit-learnよりデータを抽出する
from sklearn.datasets import fetch_california_housing
data = fetch_california_housing()


#説明変数をdataXに格納する
dataX = pd.DataFrame(data=data.data,columns=data.feature_names)
print(dataX.shape)

#目的変数をdataYに格納する
dataY = pd.DataFrame(data=data.target)
dataY = dataY.rename(columns={0: 'target'})
print(dataY.shape)



# 対数化しておく(価格予測とかではやりがち、気になったら調べてください)
dataY=dataY.iloc[::].apply(np.log)

ここで、実際に、dataXやdataYを表示してみて中にどんな変数があるのか?とか欠損はあるのか?とか見てみるといいと思います!

訓練データと評価用データに分割する。

#データの分割を行う(訓練用データ 0.7 評価用データ 0.3)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(dataX, dataY, test_size=0.4,random_state=0)

比較するためにまとめて書く

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.svm import SVR
from sklearn.neural_network import MLPRegressor

from sklearn.metrics import mean_squared_error

models = []
models.append(("線形回帰","LinaerRegression",LinearRegression()))
models.append(("ランダムフォレスト","Random Forest",RandomForestRegressor()))
models.append(("勾配ブースト","GradientBoostingRegressor",GradientBoostingRegressor()))
# models.append(("サポートベクターマシン(線形)","SVR(linear)",SVR(kernel='poly', C=1, epsilon=0.1, gamma='auto')))
models.append(("サポートベクターマシン(非線形)","SVR(rbf)",SVR(kernel='rbf', C=1, epsilon=0.1, gamma='auto')))
models.append(("多層パーセプトロンパーセプトロン","MLPRegressor",MLPRegressor(hidden_layer_sizes=(10,10,10), max_iter=500)))

names_jp = []
names_en = []
results = []

for name_jp,name_en,model in models:
    print(name_jp)
    print(model.fit(X_train.values,Y_train.values.reshape(-1,)),"\n")
    
    names_jp.append(name_jp)
    names_en.append(name_en)
    
    score=mean_squared_error(Y_test.values.reshape(-1,),model.predict(X_test.values))
    results.append(score)

※念のために、学習と予測が以下の様に行う。

#モデルの学習
model.fit(X_train,Y_train)#valuesとかをつけてnumpy形状にしたりする時も
#予測
model.fit(X_test)

評価一覧を下で見れる。

list_df = pd.DataFrame(columns=['識別子','モジュール名','スコア'] )
 
for i in range(len(names_jp)):
    list_df = pd.concat([list_df,pd.DataFrame([names_jp[i],names_en[i],results[i]],index=list_df.columns).T])

list_df

実際に自分でコードをコピペして動かしてみてください!データによってや、モデルのパラメータによっても全然結果が変わってきます!実際に自分で動かしてみるだけでも全然習得イメージできるので、試してみてください!

目的変数がカテゴリ型変数のである分類(classification)

例として、あやめのデータセットをもちいて予測してみます。

#scikit-learnよりあやめのデータを抽出する
from sklearn import datasets
data = datasets.load_iris()
#説明変数をdataXに格納
dataX = pd.DataFrame(data=data.data,columns=data.feature_names)
dataX.shape
#目的変数をdataYに格納
dataY = pd.DataFrame(data=data.target)
dataY = dataY.rename(columns={0: 'Species'})
dataY.shape


ここで線形回帰同様に、実際に、dataXやdataYを表示してみて中にどんな変数があるのか?とか欠損はあるのか?とか見てみるといいと思います!

訓練データと評価用データに分割する。

#データの分割を行う(訓練用データ 0.7 評価用データ 0.3)
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(dataX, dataY, test_size=0.4,random_state=0)

評価一覧を下で見れます。

models = []
models.append(("ロジスティック回帰","LogisticRegression",LogisticRegression(max_iter=1000)))
models.append(("k近傍法","k-Nearest Neighbors",KNeighborsClassifier()))
models.append(("決定木","Decision Tree",DecisionTreeClassifier()))
models.append(("ランダムフォレスト","Random Forest",RandomForestClassifier()))
models.append(("サポートベクターマシン(線形)","Support Vector Machine(linear)",SVC(kernel='linear')))
models.append(("サポートベクターマシン(非線形)","Support Vector Machine(rbf)",SVC(kernel='rbf')))
models.append(("多層パーセプトロンパーセプトロン","Multilayer perceptron",MLPClassifier(max_iter=500)))
models.append(("ナイーブベイズ","naive_bayes.MultinomialNB()",MultinomialNB()))

names_jp = []
names_en = []
results = []
for name_jp,name_en,model in models:
    
    print(model.fit(X_train.values,Y_train.values.reshape(Y_train.shape[0])),"\n")
    
    names_jp.append(name_jp)
    names_en.append(name_en)
    results.append(model.score(X_test.values,Y_test.values.reshape(Y_test.shape[0])))
list_df = pd.DataFrame(columns=['識別子','モジュール名','スコア'] )
 
for i in range(len(names_jp)):
    list_df = pd.concat([list_df,pd.DataFrame([names_jp[i],names_en[i],results[i]],index=list_df.columns).T])

list_df

おまけ 特徴量同士の四則演算

特徴量を増やすために、特徴量同士を四則演算するときがあります。その時の例を下のコードにまとめておきます。

import featuretools as ft

es = ft.EntitySet(id='example')

es = es.add_dataframe(dataframe_name='locations',
                               dataframe=dataX,
                               index='name',  # 便宜上、名前をインデックス代わりにする
                               )

feature_matrix, feature_defs = ft.dfs(entityset=es,
                                       target_dataframe_name='locations',
                                       trans_primitives=['add_numeric', 'subtract_numeric','divide_numeric','multiply_numeric'],#ここで四則演算の指定が可能
                                       agg_primitives=[],
                                       max_depth=1,
                                       )

feature_matrix.reset_index(drop=True)

まとめ

回帰と分類についてほぼコードのみをまとめてみました。実際に使うときもすべてを覚えているわけではないので、備忘録としてコピペできるように今後もまとめていきたいと思います。

もし、この記事を読んで参考になった・他の記事も読んでみたいと思った方、twitterのフォローボタンを押していただけるとモチベーション向上につながるので、よろしくお願いいたします。

コメント

タイトルとURLをコピーしました