2019年5月アーカイブ

概要

ML.NETは、Microsoftが開発したクロスプラットフォーム対応の機械学習フレームワークである。 ML.NETで提供されているAutoMLを使うと、アルゴリズムの選択やオプションの設定などが自動で行われ、最も良い結果を出したモデルを得ることができる。 今回は、AutoMLによる文章の二項分類を行った。

環境

  • macOS Sierra 10.12.6
  • .NET SDK 2.2.107
  • ML.NET 0.3.27703.4

手順

.NET SDKのインストール

次のURLからインストーラをダウンロードし、インストールする。

Download .NET Core

ML.NET CLIのインストール

.NET SDKに含まれる dotnet コマンドを使用し、ML.NET CLIをインストールする。

$ dotnet tool install -g mlnet

AutoMLを用いたテキスト分類

1. 新規ディレクトリを作成する

$ mkdir myMLApp
$ cd myMLApp

2. Wikipedia detoxデータセットをダウンロードする

以下のようにしてデータセットをダウンロードする。

$ curl -O 'https://raw.githubusercontent.com/dotnet/machinelearning/master/test/data/wikipedia-detox-250-line-data.tsv'

wikipedia-detox-250-line-data.tsv は、文章が否定的(Sentiment=1)か肯定的(Sentiment=0)かがラベル付けされている。 データは以下のような形式になっている。

Sentiment   SentimentText
1           ==RUDE== Dude, you are rude upload that carl picture back, or else.
1           == OK! ==  IM GOING TO VANDALIZE WILD ONES WIKI THEN!!! 
0 I hope this helps.

3. 学習をする

与えられた文章に対して、Sentimentで二項分類するように学習する。 下記の mlnet auto-train コマンドを実行すると、様々なデータ変換、アルゴリズム、アルゴリズムのオプションが組み合わせて試された後、最も結果の良いものが出力される。

$ mlnet auto-train --task binary-classification --dataset "wikipedia-detox-250-line-data.tsv" --label-column-name "Sentiment" --max-exploration-time 10

オプションの意味は以下の通り。

  • --task: 機械学習の種類
  • --dataset: 使用するデータセット
  • --label-column-name: データセットの中で推論したいラベル
  • --max-exploration-time: ML.NETがモデルを探索する最大の秒数

実行すると以下のようなログが出力される。

Best Accuracy: 88.24%, Best Algorithm: LinearSvmBinary, Last Algorith...00:00:10

===============================================Experiment Results=================================================
------------------------------------------------------------------------------------------------------------------
|                                                     Summary                                                    |
------------------------------------------------------------------------------------------------------------------
|ML Task: binary-classification                                                                                  |
|Dataset: wikipedia-detox-250-line-data.tsv                                                                      |
|Label : Sentiment                                                                                               |
|Total experiment time : 10.42 Secs                                                                              |
|Total number of models explored: 33                                                                             |
------------------------------------------------------------------------------------------------------------------
|                                              Top 5 models explored                                             |
------------------------------------------------------------------------------------------------------------------
|     Trainer                              Accuracy      AUC    AUPRC  F1-score  Duration #Iteration             |
|1    LinearSvmBinary                        0.8824   0.7273   0.7848    0.9167       0.2         17             |
|2    SgdCalibratedBinary                    0.8235   0.7576   0.7857    0.8696       0.2          7             |
|3    SgdCalibratedBinary                    0.8235   0.7576   0.7857    0.8696       0.2         10             |
|4    SgdCalibratedBinary                    0.8235   0.7576   0.7857    0.8696       0.2         19             |
|5    SgdCalibratedBinary                    0.8235   0.7576   0.7857    0.8696       0.2         22             |
------------------------------------------------------------------------------------------------------------------

表の見出しの意味は次の通り。

  • Trainer: 学習に使われたアルゴリズム
  • Duration: 学習時間
  • #Iteration: 学習の反復回数

評価指標(Accuracy、AUC、AUPRC、F1-score)については以下を参照。

学習後、ディレクトリ構成は以下のようになる。

.
├── SampleBinaryClassification
│   ├── SampleBinaryClassification.ConsoleApp
│   │   ├── ModelBuilder.cs
│   │   ├── Program.cs
│   │   └── SampleBinaryClassification.ConsoleApp.csproj
│   ├── SampleBinaryClassification.Model
│   │   ├── DataModels
│   │   │   ├── ModelInput.cs
│   │   │   └── ModelOutput.cs
│   │   ├── MLModel.zip
│   │   └── SampleBinaryClassification.Model.csproj
│   ├── SampleBinaryClassification.sln
│   └── logs
│       └── debug_log.txt
└── wikipedia-detox-250-line-data.tsv

4. 学習したモデルを使用する

自動生成されるサンプルプロジェクトは、データファイルから一つの文章を取り出して推論をする内容となっている。 サンプルプロジェクトを実行するには以下のようにする。

$ cd SampleBinaryClassification/SampleBinaryClassification.ConsoleApp
$ dotnet run

出力結果

Single Prediction --> Actual value: True | Predicted value: True
=============== End of process, hit any key to finish ===============

参考

こんにちは、システム部の大瀧です。

今回は初歩ということでGoogle Colaboratoryを使ってみようと思います。
せっかくなので実際に動くものとして、scikit-learnが用意しているbostonのデータセットを使って初歩的な単回帰分析を行ってみます。

1. Google Colaboratoryとは

Colaboratoryは、完全にクラウドで実行されるJupyterノートブック環境です。設定不要で、無料でご利用になれます。
Colaboratoryを使用すると、コードの記述と実行、解析の保存や共有、強力なコンピューティングリソースへのアクセスなどをブラウザからすべて無料で行えます。

Google Codelaboratoryへようこそ より

つまりGoogle Colaboratory(以下Colab, コラボと読むようです)は、端的にいうとクラウド版のjupyter notebookということです。
誰でも無料で簡単に利用することができるという敷居の低さや、GPU環境を無料で利用可能であることなどがColabのメリットです。

補足. jupyter notebookとは

「jupyter notebookが何か」を簡潔にいうとプログラムの実行環境のことなのですが、優れているのはnotebookというだけあってコードだけでなくメモやファイル、コードの実行結果などをノートのように残すことができる点です。
特にデータの処理を行ったグラフなどを残しておけるのは非常に見やすく、データを分析する助けになります。

2. 実際に動かしてみる

Colabの準備は簡単です。
Googleアカウントを用意しましょう。それだけです。

https://colab.research.google.com/にアクセスします。
以下のような画面が表示されるはずです。

blog_colab_01.png

次に新しいノートブックを作成します。
メニューの「ファイル」から「Python3の新しいノートブック」を選択すると真っさらなノートブックが作成されます。

blog_colab_02.png


画像の赤枠が「セル」と呼ばれ、コードはセル単位で実行することが可能です。
せっかくなので簡単にコードを記載してみます。
今回はscikit-learnというライブラリのBostonデータセットを使ってなんちゃって線形回帰を試してみたいと思います。

blog_colab_03.png

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston

# データセットの取得
# 米国ボストン市郊外における地域別の住宅価格のデータセット
boston = load_boston()

# 取得したデータをpandasのdataframeへ
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
price = boston.target.reshape(-1,1)
lstat = boston_df['LSTAT'].values
plt.scatter(price, lstat)
plt.xlabel('house price') # x軸のラベル
plt.ylabel('% lower status of the population') # y軸のラベル
plt.grid() # グリッド線を表示
plt.show() # 図の表示

実行するコードをセルに書き込んだらセルの左上にある再生ボタン?を押しましょう。これでコードが実行されます。
もし複数のセルを実行したい場合は、メニューにある「ランタイム」の項目の「すべてのセルを実行」を選択してください。他にも一部のセルのみを実行することなどが可能です。

blog_colab_04.png

実行するとグラフが描画されます。
今回は「地域別住宅価格(X軸)」と「給与の低い職業に従事する人口の割合 (%)(Y軸)」のグラフです。プロットされたドットをみるとどうやら相関関係がありそうです。
当たり前かもしれませんが、住宅の価格が高い地域には給与の低い職業に従事する人が少ないようです。

ではこれらを線形回帰(今回は手抜き単回帰分析)します。
描画されたグラフはそのままに新たに分析結果を追加したグラフを描画します。
メニュー下の「+コード」を押します。

新たに作成されたセルに新たにコードを書き込み、今回書き込んだセルの左上にある再生ボタンをクリックすると、このセルのみが実行されます。
画像のように線形直線が描画された新たなグラフが表示されたでしょうか。

blog_colab_05.png

# 線形回帰モデルのクラスを読み込み
from sklearn.linear_model import LinearRegression
# 線形回帰のインスタンスを生成
lr = LinearRegression()

# 単回帰モデルの学習を実行
lr.fit(price, lstat)
plt.scatter(price, lstat)
plt.xlabel('house price') # x軸のラベル
plt.ylabel('% lower status of the population') # y軸のラベル
plt.grid()
plt.plot(price, lr.predict(price), color = 'red')
plt.show()

作成したファイルなのですが、アカウントのGoogle Drive内にColab Notebooksというフォルダができており、そこに保存されています。ここで察しがつくのですが、Google Driveに保存されているファイル(例えば集計データなど)をロードして、コードの中で使うことも容易になっており、そういう点もColabの魅了ですね。

今回のサンプルを公開しておきます[リンク]
このように簡単に公開できることも大きな魅力ですが、これらを自身のワークスペースに複製して編集することなどもできます。

今回のサンプルはグラフの描画などを行いましたが、単純にPythonを初めて触る際にも使い勝手が良いかと思いますので是非使ってみましょう。

概要

ビルド済みのTensorFlowをpipでインストールすると、CPUの命令セットのAVX2やFMAが有効にならない。 AVX2やFMAを用いると、演算速度や精度の向上が期待できる。

参考 MMX, SSE, AVX, FMA命令とは何かを明らかにしたい会

そこで今回は、ソースコードからビルドしてAVX2とFMAを有効にしたTensorFlowを用意し、ビルド済みのパッケージをインストールしたものと、速度や精度の比較を行った。

環境

  • プロセッサ Intel Core i7-5557U 3.1 GHz
  • メモリ 16GB 1867 MHz DDR3
  • macOS Sierra 10.12.6
  • Python 3.6.8
  • TensorFlow 1.13.1

方法

学習は以下のようなCNNで行った。 データセットはMNIST、Fashion MNIST、CIFAR-10を用いた。

import tensorflow as tf

# データセットの選択
dataset = tf.keras.datasets.mnist
# dataset = tf.keras.datasets.fashion_mnist
# dataset = tf.keras.datasets.cifar10

(x_train, y_train), (x_test, y_test) = dataset.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

# shapeをモデルの入力に合わせる
if len(x_train.shape) == 3:
    x_train = x_train.reshape(x_train.shape + (1,));
    x_test = x_test.reshape(x_test.shape + (1,));

# CNNモデルの作成
model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32,
        kernel_size=(3, 3),
        activation=tf.nn.relu,
        input_shape=x_train.shape[1:]),
    tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
    tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
    tf.keras.layers.Dropout(0.25),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation=tf.nn.relu),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy'])

# 訓練
model.fit(x_train, y_train, epochs=12)
# 評価
model.evaluate(x_test, y_test)

計測は以下のコマンドで行った。

$ time python cnn.py

結果

MNIST

AVX2, FMA 有 AVX2, FMA 無
学習時間 26m37s 28m32s 6.7%
精度 0.9939 0.9928 +0.0011

Fashion MNIST

AVX2, FMA 有 AVX2, FMA 無
学習時間 25m30s 27m59s 8.9%
精度 0.9218 0.9241 -0.0023

CIFAR-10

AVX2, FMA 有 AVX2, FMA 無
学習時間 32m00s 37m04s 13.7%
精度 0.7049 0.7034 +0.0015

まとめ

AVX2, FMAが有効であると実行時間が短くなった。一方、精度はあまり変わらなかった。

このアーカイブについて

このページには、2019年5月に書かれた記事が新しい順に公開されています。

前のアーカイブは2019年4月です。

次のアーカイブは2019年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。