Python(パイソン)で人工知能を開発したい人向けに、これだけは知ってほしいという知識をまとめました。本記事だけで、PythonでAIを実装出来るはず。
まあ簡単に言うと、データをきれいにして、サーキットラーン(scikit-learn)というライブラリにデータ食わせれば、予測モデル(=人工知能)が作れるというお話です。
scikit-learnには、いろいろな機械学習(AI)のアルゴリズムが入っています。その中でもロジスティック回帰やランダムフォレストがよく利用されています。なぜなら、比較的少ないデータでも精度の高いモデルを作ることが出来るからですね。2値分類でよく利用されるアルゴリズムです。
またscikit-learnには、データの前処理、パラメータ探索、交差検定など、AI開発で必要な機能がほぼ全て搭載されています。使い方は簡単です。Pythonのプログラムからインポートして関数を呼び出すだけです。ネットに繋ぎに行くのではなくローカル環境で使えるのも地味に嬉しいところです。
※本記事のPythonのバージョンはPython2.7です。
1.4 csv読み込み
csvファイルの読み込みは、NumPyで読み込む方法と、Pandasで読み込む方法の2つある。
◆NumPyの場合
N次元配列になるので、列毎に同じ型かつ同じ要素数でないと読み込みエラーになる。
◆Pandasの場合
表形式になるので、列毎に異なる型で異なる要素数でも読み込みOK。こちらを推奨します。
属人的な業務になりがちだが、最低限必要な処理を一覧化。
その場合、欠損値を平均値や最頻値で補完する。
カラムの型が数値型なら平均値で補完、カテゴリ型なら最頻値で補完する。
#strategyの引数を'median'で中央値、'frequent'で最頻値で補完
機械学習アルゴリズムは、誤差の最小化やマージンを最大化している。
1億など非常に大きなデータがあると、そちらに引きずられやすくなる。
そのため、各特徴量の影響度を均一化することで、より精度の高いモデルを作成しやすい。
(決定木やランダムフォレストではスケーリング不要)
参考記事:実務で使うとこだけ!Python機械学習(AI)のデータ処理(Pandas/scikit-learn)
線形SVMは直線でしか分類できない。非線形SVMは曲線で分類できる。
迷ったらより表現力の高い非線形を選べば良い。
非線形SVMのパラメータには、コスト関数Cとカーネルの幅の広さgammaの2つある。
Cは誤分類のペナルティ、gammaはカーネルの滑らかさ。
共に値が大きいほど学習が進むが、その分過学習のリスクが高まる。
fitメソッドでモデル作成。
※機械学習アルゴリズムは、SVMの他にもたくさんあります。実務的によく利用されるのは、重回帰分析、ロジスティック回帰、クラスタリング、決定木、ランダムフォレスト、lightGBMあたりです。
最適なパラメータは、Grid Searchで求めることが出来る。
総当たりで一番精度の高いパラメータを教えてくれる。
#正解率
print accuracy_score(y_train, y)
scikit-learnのcross_validationで交差検定を行う。
train_test_split関数で学習データとテストデータに分割する。
モデル評価で最も参考にすべき指標。正解率だけだと過学習の可能性があるため。
参考記事:交差検定(クロスバリデーション)など機械学習の評価方法まとめ
AIエンジニアが教えるゼロから機械学習の勉強法
AI開発や機械学習の知識はホワイトカラーのリテラシーです。基礎を固めて少しずつ仕事で活かしていくことで、熟練度が上がっていくと感じます。
転職の体験談:転職エージェントにボコボコにされて未経験からAIエンジニアに転職した話
まあ簡単に言うと、データをきれいにして、サーキットラーン(scikit-learn)というライブラリにデータ食わせれば、予測モデル(=人工知能)が作れるというお話です。
AI開発のプログラミング言語はPython一択
AI開発のプログラミング言語はPython一択です。理由は3つあります。
①Python向けの人工知能ライブラリが豊富だから
・データ処理:NumPy、Pandas
・作図:Matplotlib
・ディープラーニング開発:PyTorch、TensorFlow
・機械学習:scikit-learn
②Pythonは業務システムやWebサービスとして実装可能(Rで業務システムは作れません)
③シンプルな言語で可読性が高くプログラミングが簡単
機械学習エンジニア・データサイエンティストの求人は、ほぼ確実にPythonが前提条件です。
人工知能ライブラリのディファクトスタンダードはscikit-learn
scikit-learn(サーキットラーン)はAI開発のディファクトスタンダードです。元々Googleが開発していたものがオープン化されました。特徴は3つあります。
①無料で使える
②BSDライセンスなので商用利用OK
③アルゴリズムやモデル評価の機能が非常に豊富
scikit-learnには、いろいろな機械学習(AI)のアルゴリズムが入っています。その中でもロジスティック回帰やランダムフォレストがよく利用されています。なぜなら、比較的少ないデータでも精度の高いモデルを作ることが出来るからですね。2値分類でよく利用されるアルゴリズムです。
またscikit-learnには、データの前処理、パラメータ探索、交差検定など、AI開発で必要な機能がほぼ全て搭載されています。使い方は簡単です。Pythonのプログラムからインポートして関数を呼び出すだけです。ネットに繋ぎに行くのではなくローカル環境で使えるのも地味に嬉しいところです。
Pythonとscikit-learnを理解すれば人工知能は無料で作れるのです。
※本記事のPythonのバージョンはPython2.7です。
1.Pythonの基礎編
Python機械学習でよく利用する関数一覧。1.1 Print文
#文字列の表示
print "hello world"
#数字の表示
print 12345
print "hello world"
#数字の表示
print 12345
1.2 if文
#条件分岐
abc = 8
if abc >= 10:
print "abcは10以上です"
else:
print"abcは10未満です"
abc = 8
if abc >= 10:
print "abcは10以上です"
else:
print"abcは10未満です"
1.3 for文
ループ処理。配列の要素を順番に取り出す時に利用する。#iは変数
for i in [25, 36, 18, 60, 46, 32]:
print i
for i in [25, 36, 18, 60, 46, 32]:
print i
1.4 csv読み込み
csvファイルの読み込みは、NumPyで読み込む方法と、Pandasで読み込む方法の2つある。◆NumPyの場合
N次元配列になるので、列毎に同じ型かつ同じ要素数でないと読み込みエラーになる。
#numpyをインポート
import numpy as np
import numpy as np
#delimiterで区切り文字を指定。skiprowsでヘッダ行を飛ばす。
csvdata = np.loadtxt("inputdata.csv",delimiter=",", skiprows=1)
csvdata = np.loadtxt("inputdata.csv",delimiter=",", skiprows=1)
◆Pandasの場合
表形式になるので、列毎に異なる型で異なる要素数でも読み込みOK。こちらを推奨します。
#pandasをインポート
import pandas as pd
#csv読み込み
csvdata = pd.read_csv('inputdata.csv')
# 特徴量Xと教師ラベルyを分割して格納
import pandas as pd
#csv読み込み
csvdata = pd.read_csv('inputdata.csv')
# 特徴量Xと教師ラベルyを分割して格納
X = csvdata.iloc[:, 0:-1].values
y = csvdata.iloc[:, -1].values
※教師ラベルがcsvデータの右端列にあるケース
※教師ラベルがcsvデータの右端列にあるケース
1.5 文字列フォーマット
x = "SUZUKI"
y = 26
#formatメソッドで変数を出力
print "I am {0},{1} years old.".format(x,y)
y = 26
#formatメソッドで変数を出力
print "I am {0},{1} years old.".format(x,y)
2.データの前処理
予測モデルの精度は、品質の高い学習データが必要。属人的な業務になりがちだが、最低限必要な処理を一覧化。
2.1 欠損値の削除
#dropnaメソッドで欠損値を含む行を削除。axis=1で行を指定。
csvdata.dropna(axis=1)
2.2欠孫値の補完
欠損値を行削除すると、データ件数が足りなくなることがある。その場合、欠損値を平均値や最頻値で補完する。
カラムの型が数値型なら平均値で補完、カテゴリ型なら最頻値で補完する。
#sklearnのImputerクラスのインポート
from sklearn.preprocessing import Imputer
#欠測値のインスタンスを作成(平均値補完)#strategyの引数を'median'で中央値、'frequent'で最頻値で補完
imr = Imputer(missing_values='NaN', strategy='mean', axis=0)
#データを適合
#データを適合
imr = imr.fit(csvdata)
#平均値で補完を実行
imputed_data = imr.transform(csvdata.values)
#平均値で補完を実行
imputed_data = imr.transform(csvdata.values)
print imputed_data
2.3 カテゴリデータの変換
文字列のカテゴリデータは、数値に変換が必要。
#性別のカテゴリデータと対応する数値データのディクショナリを作成
human = {'man': 0, 'woman': 1, 'children': 2}
human = {'man': 0, 'woman': 1, 'children': 2}
#カテゴリデータを整数に変換
csvdata['column'] = csvdata['column'].map(human)
2.4 データのスケーリング(標準化)
データを標準化して、0から1の範囲にスケーリングする。機械学習アルゴリズムは、誤差の最小化やマージンを最大化している。
1億など非常に大きなデータがあると、そちらに引きずられやすくなる。
そのため、各特徴量の影響度を均一化することで、より精度の高いモデルを作成しやすい。
(決定木やランダムフォレストではスケーリング不要)
#各データに対し、平均を引いて標準偏差で割る
csvdata_new = preprocessing.scale(csvdata)
csvdata_new = preprocessing.scale(csvdata)
参考記事:実務で使うとこだけ!Python機械学習(AI)のデータ処理(Pandas/scikit-learn)
3.scikit-learnでモデル作成
scikit-learnは、機械学習のディファクトスタンダード。scikit-learnが使えれば機械学習でほぼ困らない。3.1 SVMでモデル作成
機械学習アルゴリズムの一つであるSVMは、線形SVMと非線形SVMの2つある。線形SVMは直線でしか分類できない。非線形SVMは曲線で分類できる。
迷ったらより表現力の高い非線形を選べば良い。
非線形SVMのパラメータには、コスト関数Cとカーネルの幅の広さgammaの2つある。
Cは誤分類のペナルティ、gammaはカーネルの滑らかさ。
共に値が大きいほど学習が進むが、その分過学習のリスクが高まる。
fitメソッドでモデル作成。
#sklearnのsvmとtrain_test_splitクラスのインポート
from sklearn import svm
from sklearn.model_selection import train_test_split
#分類器とパラメータの定義
estimator = svm.SVC(C=3.0, gamma=0.1)
#データを学習用のデータとテスト用のデータに分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=8)
#SVMでモデル作成
estimator.fit(X_train, y_train)
from sklearn import svm
from sklearn.model_selection import train_test_split
#分類器とパラメータの定義
estimator = svm.SVC(C=3.0, gamma=0.1)
#データを学習用のデータとテスト用のデータに分割する
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=8)
#SVMでモデル作成
estimator.fit(X_train, y_train)
※機械学習アルゴリズムは、SVMの他にもたくさんあります。実務的によく利用されるのは、重回帰分析、ロジスティック回帰、クラスタリング、決定木、ランダムフォレスト、lightGBMあたりです。
3.2 SVMモデルのパラメータ調整(Grid Search)
ハイパーパラメータのCとgammaは、どんな値を設定すればいいのか。最適なパラメータは、Grid Searchで求めることが出来る。
総当たりで一番精度の高いパラメータを教えてくれる。
#sklearnのgrid_searchクラスのインポート
from sklearn import grid_search
#グリッドサーチでパラメータ最適化
parameters = { 'C': [0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1]}
from sklearn import grid_search
#グリッドサーチでパラメータ最適化
parameters = { 'C': [0.1, 1, 10, 100], 'gamma': [0.001, 0.01, 0.1]}
#スコアの良い物を探索
gscv = grid_search.GridSearchCV(svm.SVC(), parameters, cv=5)
gscv.fit(X_train, y_train)
#一番スコア良いパラメータを表示
reg_max = gscv.best_estimator_
#Bestパラメータを使って再学習
reg_max.fit(X_train, y_train)
#正答(青)&良い(赤)の結果をPLOT
plt.plot(X_test, y_test, 'bo-',X_test, reg_max.predict(X_test), 'ro-',X_test)
plt.show()
4.scikit-learnでモデル評価
4.1 モデルの評価(Confusion Matrix、正解率)
scikit-learnのpredict関数で予測データを作成。Confusion Matrix(混合行列)で評価。#予測データ作成
y = estimator.predict(X_train)
#Confusion Matrix
print confusion_matrix(y_train, y)
#正解率
print accuracy_score(y_train, y)
4.2 モデルの評価(交差検定)
train_test_split関数で学習データとテストデータに分割する。
モデル評価で最も参考にすべき指標。正解率だけだと過学習の可能性があるため。
#sklearnのcross_val_scoreクラスのインポート
from sklearn.model_selection import cross_val_score
#交差検定(データを10分割)
print cross_val_score(estimator, X_train, y_train, cx=10)
from sklearn.model_selection import cross_val_score
#交差検定(データを10分割)
print cross_val_score(estimator, X_train, y_train, cx=10)
参考記事:交差検定(クロスバリデーション)など機械学習の評価方法まとめ
pythonでAI開発まとめ
AI開発の基礎を1枚の図でまとめてみました。Pythonとscikit-learnを使えば、わりと簡単にAIを作ることが出来ます。もっと詳しくAI開発(機械学習)を知りたい方へ
もっと詳しく機械学習を知りたい方向けに、参考資料をまとめてみました。①本:Python機械学習プログラミング
米国Amazon.comでランキング一位の本です。日本でもベストセラーで星4.4の高評価を得た1冊です。入門書としても非常にお勧めできる本です。私もぼろぼろになるまで読みました。本記事の参考書籍です。Sebastian Raschka
インプレス
2016-06-30
②勉強方法の記事:ゼロから機械学習を勉強する方法
本ブログの記事です。機械学習の勉強方法を解説しています。AIエンジニアが教えるゼロから機械学習の勉強法
AI開発や機械学習の知識はホワイトカラーのリテラシーです。基礎を固めて少しずつ仕事で活かしていくことで、熟練度が上がっていくと感じます。
転職の体験談:転職エージェントにボコボコにされて未経験からAIエンジニアに転職した話