プログラミング歴半年が機械学習モデルの実装してみた(Python)

Machine-learning

はじめに

こんにちは。わたやんです。

今回はプログラミング超初心者の僕が機械学習してみたので、記事にしました。

「プログラミングを勉強しているが、機械学習についてはさっぱり」って人にむけて機械学習の流れをわかってもらえるようにざっと解説します

機械学習の手順

さっそくやっていきましょう。

機械学習は、教師あり学習、教師なし学習、強化学習の3種類に大別されます。

今回は教師あり学習の重回帰分析をしていきたいと思います。

「教師あり学習?なんやそれ」と思った人はこちらをどうぞ → 今さら聞けない機械学習

1.ライブラリの読み込み

まずは使用するライブラリをimportしましょう。

# データ加工・処理・分析ライブラリ
import numpy as np
import numpy.random as random
import scipy as sp
from pandas import Series, DataFrame
import pandas as pd

# 可視化ライブラリ
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
%matplotlib inline

# 機械学習ライブラリ
import sklearn

# 小数第3位まで表示
%precision 3

2.学習データの読み込み

ここでは、自動車の価格とそれらの属性(自動車の大きさなど)データがあるとき、その属性から自動車価格を予測するモデルを構築してみます。

# インポート
import requests, zipfile
import io

# 自動車価格データを取得
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/autos/imports-85.data'
res = requests.get(url).content

# 取得したデータをDataFrameオブジェクトとして読み込み
Car= pd.read_csv(io.StringIO(res.decode('utf-8')), header=None)

# データの列にラベルを設定
Car.columns =['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration', 'num-of-doors',
                            'body-style', 'drive-wheels', 'engine-location', 'wheel-base', 'length', 'width', 'height',
                            'curb-weight', 'engine-type', 'num-of-cylinders', 'engine-size', 'fuel-system', 'bore',
                            'stroke', 'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg', 'highway-mpg', 'price']

3.データの特徴、構造の把握

手順2で読み込んだデータを実際に見ていきます。

#head()メソッドで最初の5行を表示(引数に指定した数の行を表示できる。デフォルトは5)
Car.head()

このデータにおいて、自動車の価格はpriceに設定されています。

ここでは自動車の属性から価格を予測するモデルを作ろうとしているのですから、price以外の値からpriceを予測するモデルを作るというのが課題となります。

すべての説明変数からpriceを予測するのは複雑なので、この課題では、horsepowerwidthheightの3つの説明変数だけを使うものとします。

つまり、horsepowerwidthheightという説明変数からpriceという目的変数を予測するというモデルを作成していくものとします。

Car = Car[['price', 'horsepower', 'width', 'height']]

4.データ加工、整形

head()を使ってデータを確認しましたが、このとき、データの中に’?’のあることに気づきます。

多くの機械学習のアルゴリズムは、数値型データしか扱えないため、このような「?」などの非数値データを含む変数に対しては、それを取り除く前処理が必要です。→カテゴリカル変数のエンコーディングまとめ(機械学習)

# それぞれのカラムに ? が何個あるかカウント
Car.isin(['?']).sum()

# '?'をNaNに置換して、NaNがある行を削除
Car= Car.replace('?', np.nan).dropna()

次にデータの型を確認します。

Car.dtypes

pricehorsepowerが数値型ではないことがわかります。そこでto_numericを使って数値型に変換しておきます。

Car = Car.assign(price=pd.to_numeric(Car.price))
Car =Car.assign(horsepower=pd.to_numeric(Car.horsepower))
#データ型の確認
Car.dtypes

5.データの分割


機械学習では読み込んだデータの全てを使って学習するわけではありません。

読み込んだデータを学習用データテスト用データに分けます。


データを学習用とテスト用に分割する理由は、学習用データで学習したモデルの精度をテスト用のデータで測定するためです。

そこで以下では、Scikit-learnのmodel_selectionモジュールのtrain_test_split関数を使い、訓練データとテストデータに分けています。

# データ分割(訓練データとテストデータ)のためのインポート
from sklearn.model_selection import train_test_split

 # 目的変数にpriceを指定、説明変数にそれ以外を指定
X = Car.drop('price', axis=1
y = Car['price']

# 訓練データとテストデータに分ける
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

6.学習させる

重回帰のモデル構築は、LinearRegressionクラスを使って行います。

model = LinearRegression()」でインスタンスを作成して、

訓練データを「model.fit(X_train, y_train)」のように読み込ませると学習が完了します。

# 重回帰のモデル構築のためのインポート
from sklearn.linear_model import LinearRegression

# 重回帰クラスの初期化と学習
model = LinearRegression()
model.fit(X_train, y_train)

7.精度を測る

学習したら、決定係数を確認してみましょう。

決定係数とは、目的変数によって予測された値が、実際の目的変数の値とどのくらい近いかを示す値です。

決定係数はscoreメソッドで取得できます。

# 決定係数を表示
print('決定係数(train):{:.3f}'.format(model.score(X_train, y_train)))
print('決定係数(test):{:.3f}'.format(model.score(X_test, y_test)))

訓練データに対する精度は良いがテストデータに対する精度が低くなるということがしばしば起きます。このことを過学習と言います。

上記の結果では、train(訓練データ)で0.733、test(テストデータ)で0.737とわかります。

訓練時スコアとテスト時のスコアが近いことから、このモデルは過学習に陥ってはいないと判断できます。

まとめ

以上が重回帰によるモデル構築、評価の流れです。

重回帰分析以外の決定木やロジスティック回帰なども基本的には同じ流れで行うことができます。

ここでは、全体の流れを把握していただくため、ざっと解説しましたが、本来はモデル精度向上のため、いろいろと試行錯誤していく必要があります。

(例えば、今回は欠損値がある行を削除しましたが、平均値や最頻値で埋めるという方法もあります)

ただ機械学習は思ったよりも簡単に実装できることが、上記のコードを見るとわかってもらえるのではないでしょうか。

みなさんもぜひ、機械学習をマスターして、年収も将来性も高い機械学習エンジニアを目指されてみてはいかがでしょうか?↓↓

機会学習エンジニアに必要なスキルとは


人工知能と機械学習の人気オンライン講座

コメント

  1. […] プログラミング歴半年が機械学習モデルの実装してみた(Python) […]

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