機械学習(簡単なモデル作成)


初めに

この記事では簡単な機械学習のモデルを作ってみます。モデルとは入力データに対して出力データを導き出す仕組みのことです。(後ほどもう少し説明します。)
環境はgoogle colabotoryを使っています。
今回はkaggleのMelbourne Housing Snapshotのmelb_data.csvというデータを用います。

https://www.kaggle.com/datasets/dansbecker/melbourne-housing-snapshot

まずpandasをインポートします。pd.set_optionにより、表示する行数を最大で5行、列数を12行にしています。(このコードは実行しなくても構いません。)次にデータを読み込みます。(パスはダウンロードしたフォルダを指定して下さい。)さらにデータの先頭5行を表示します。

import pandas as pd

pd.set_option('max_rows', 5)
pd.set_option('max_columns', 12)

melb_data = pd.read_csv('/content/drive/MyDrive/Colab Notebooks/datasets/melb_data.csv')
melb_data.head()

・出力

列の名前を全て表示することができていないので、以下のコードで確認します。

melb_data.columns

・出力

欠損値について

データにはしばしば欠損が存在します。例えば、'YearBuilt'列の最初のデータはNaNとなっていて、これはデータが欠損していることを表しています。モデルの多くは欠損を含むデータを扱えないので、何らかの処理が必要となります。この記事では欠損値の処理について触れないため、欠損を含むデータは行単位で削除しようと思います。
まず、このデータには欠損値が含まれているのかを確認したいと思います。
以下のコードにより、各要素が欠損値である場合はTrue、欠損値でない場合はFalseと表示されます。例えば、'YearBuilt'列の最初のデータは欠損値(NaN)であるため、Trueと表示されます。

melb_data.isnull()

・出力

より具体的に欠損値が何個あるのか知りたい場合は以下のコードを実行します。

melb_data.isnull().values.sum()

・出力
13256

以上よりこのデータは欠損値を13256個含んでいることが確かめられました。ここでは、欠損値を含む行を全て削除したいと思います。欠損値を行もしくは列ごと削除したい場合は、pd.DataFrame.dropnaを用います。引数のaxisを0にすると行ごとに、1にすると列ごとに削除します。

melb_data = melb_data.dropna(axis=0)

では欠損値がなくなったことを確認しましょう。

melb_data.isnull().values.sum()

・出力
0

目的変数と説明変数について

データの中から目的変数を選択します。目的変数とは予測したい変数のことで、モデルの出力にあたります。ここでは'Price'を選択します。DataFrameから列を取り出す方法はこちらの記事で説明しています。

y = melb_data['Price']

次に、説明変数を選択します。説明変数とは目的変数の原因となる変数のことで、モデルの入力に使われるデータのことです。予測したい変数'Price'以外を説明変数とします。この際、先ほど紹介したpd.DataFrame.dropnaを用いて全体のデータmelb_dataから'Price'列を取り除きます。

X = melb_data.drop(['Price'], axis=1)

量的変数と質的変数

さて、ここで説明変数Xの中身を見てみます。

X.head()

・出力

例えば、'Rooms'列を見ると、2,3といった数字となっています。このように数値で表されるデータを量的変数といい、このようなデータはモデルの入力として用いることができます。一方、'SellerG'列を見ると、'Biggin','Nelson'といったカテゴリとなっています。これらのデータは数値となっておらず、そのままモデルの入力に用いることはできないため、何らかの処理が必要となります。この記事では質的変数の変換について触れないため、量的変数のみ用いようと思います。DataFrameからある特定の型のみを抽出したい場合は、pd.DataFrame.select_dtypesを用います。引数includeを['number']にすると数値データのみ抽出できます。

X = X.select_dtypes(include=['number'])

モデルの作成

最後に説明変数('Price'以外)から目的変数('Price')を導くようなモデルを作成したいと思います。モデルの作成にはscikit-learnというライブラリを用います。コードを書く際はsklearnと書きます。sklearnには様々な機械学習アルゴリズムがありますが、ここではsklearn.tree.DecisionTreeRegressorを用います。まずは、sklearn.tree.DecisionTreeRegressorをインポートします。

from sklearn.tree import DecisionTreeRegressor

次にモデルの定義を行います。引数がたくさんありますが、ここではrandom_stateのみ指定します。(random_stateに任意の整数を固定することで結果を固定することができます。)

model = DecisionTreeRegressor(random_state=0)

次にモデルの学習を行います。これにより、説明変数と目的変数の関係性を学習することができます。

model.fit(X, y)

・出力
DecisionTreeRegressor(random_state=0)

最後にこのモデルを使って予測をしたいと思います。入力データとしてはXの先頭5行にします。

model.predict(X.head())

・出力
array([1035000., 1465000., 1600000., 1876000., 1636000.])

終わりに

「モデルの作成」という項目において、モデルを学習し、そのモデルを用いて予測するということを行いました。ここでは、モデルの学習の際はXとyというデータを用いており、予測の際はXのデータの一部を用いています。つまり、モデルの学習と予測で同じデータを用いていますが、普通はモデルの学習で用いていない未知のデータに対して予測を行います。