利用事例の最近の記事

目次

  • 背景
  • 原因究明
  • 解決策
  • 結果


背景

 AUCでは、SRE活動の一環として、AWSコストの適正化を行っています。
(技術ブログ『SRE:コスト抑制のための異常値検知機構の実装』)
コスト適正化における課題は、大きく分けて下記の4つです。

①コストは月末にチェックしており、月中でコストが急激に上昇した場合発見が遅れてしまう。
② 不要なリソースが放置されていたり、新たなリリースによって生じたコストを確認していない。
③ AWSが提供するベストプラクティスによるコスト適正化が行われていない。
④ コストに対する意識が薄い。

今回のブログでは、『③ AWSが提供するベストプラクティスによるコスト適正化が行われていない。』により発生していたコスト増加について行った、原因調査〜コスト削減までを記録します。

 対象となるサービスはNAT Gatewayです。直近1年間のコスト推移調査の結果、NAT Gatewayのコストが1年で約64%増加していることを検知しました。
NAT Gatewayの料金は時間単位料金とデータ処理料金の2つあります。

  • 時間単位料金:NAT Gatewayの利用時間に対して0.062USD/時 ※
  • データ処理料金:NAT Gatewayで処理されたデータ量に対して0.062USD/GB ※
    ※東京リージョンの場合(Amazon VPCの料金より)

NAT Gateway作成後、時間単位料金は一定のため、データ処理料金が増加しているであろうことが予測できます。
NAT Gatewayの通信先を特定し、NAT Gatewayを通す必要がないデータを通してしまっていないか調査します。


原因調査

 VPCフローログを使用し、取得したログをCloudWatch Logs Insightで分析することでNAT Gatewayの通信先を特定します。

1. IAMポリシーの作成

 VPCフローログを作成する前に、VPCフローログがCloudWatch LogsにアクセスできるようにIAMポリシーを作成します。 「IAM>ポリシー>ポリシーを作成」を選択し、JSONに下記コードを記載、任意のポリシー名を付けてポリシーを作成します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    }
  ]
}   


2. IAMロールの作成

 1で作成したIAMポリシーをVPCフローログにアタッチするためのロールを作成します。
「IAM>ロール>ロールを作成」を選択し、信頼されたエンティティタイプで『カスタム信頼ポリシー』を選択して下記コードを記載します。

スクリーンショット 2023-08-16 14.43.37.png

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
} 


許可ポリシーは1で作成したポリシーを選択し、任意のロール名を付けてロールを作成します。 スクリーンショット 2023-08-16 14.44.32.png

3. CloudWatch Logs ロググループの作成

 VPCフローログのログを入れるためのロググループを作成します。
「CloudWatch>ロググループ>ロググループを作成」を選択し、任意のロググループ名を付けてロググループを作成します。

4. VPCフローログの作成

 VPCフローログを作成するための準備が整いましたので、いよいよフローログを作成します。
VPCフローログ自体には料金は発生しませんが、CloudWatch Logs側でデータ取り込み料金が発生するため、今回のように一時的な利用の場合は通信先特定後にVPCフローログを削除することをおすすめします。

調査対象のNAT GatewayのVPCにチェックを入れ、アクションで『フローログを作成』を選択します。 スクリーンショット 2023-08-16 14.29.46.png

任意のフローログ名を入力し、それぞれ下記を選択します。

  • 送信先:CloudWatch Logsに送信
  • 送信先ロググループ:3で作成したロググループ
  • IAMロール:2で作成したロール

スクリーンショット 2023-08-16 14.32.55.png スクリーンショット 2023-08-16 15.00.51.png



5. ログの分析

 取得したログを分析してNAT Gatewayの通信先を特定します。今回は1週間分のログを分析します。
「CloudWatch>ログのインサイト」で4で作成したロググループを選択し、それぞれ下記クエリを実行します。 スクリーンショット 2023-08-17 16.46.57.png

実行クエリ

①NAT Gatewayからインターネットへの通信

  • 送信元IP/CIDR
    • 'X.X.X.X':対象NAT Gatewayのプライマリプライベート IPv4 アドレスを指定
  • 除外する宛先IP/CIDR
    • 'Y.Y.Y.Y/YY':対象VPCのCIDRを除外。複数CIDRがある場合はand not isIpv4InSubnet〜を繋げる

filter (srcAddr like 'X.X.X.X') and not isIpv4InSubnet(dstAddr, 'Y.Y.Y.Y/YY')
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc


②インターネットからNAT Gatewayへの通信

  • 宛先IP/CIDR
    • 'X.X.X.X':対象NAT Gatewayのプライマリプライベート IPv4 アドレスを指定
  • 除外する送信元IP/CIDR
    • 'Y.Y.Y.Y/YY':対象VPCのCIDRを除外。複数CIDRがある場合はand not isIpv4InSubnet〜を繋げる

filter (dstAddr like 'X.X.X.X') and not isIpv4InSubnet(srdAddr, 'Y.Y.Y.Y/YY')
| stats sum(bytes) as bytesTransferred by dstAddr, srcAddr
| sort bytesTransferred desc


 上記クエリ実行により、データ通信量(bytesTransferred)の多い順で通信先IPアドレスの一覧が得られます。 IPアドレスの一覧をプレフィックスリストと照らし合わせたところ、①、②ともにNAT Gatewayの通信先のほとんどがS3であることが分かりました。

解決策

 先述の通り、NAT Gatewayを利用してEC2↔S3間のデータ通信を行う場合、NAT Gatewayの利用料金とデータ通信料金の2つのコストが発生します。 ブログ_VPCエンドポイント.drawio.png

しかし、VPCエンドポイント(Gatewayタイプ)を利用すると、EC2↔S3間のデータ通信コストは発生しません。
利用料金およびデータ通信料金が無料となるGatewayタイプのVPCエンドポイントが利用できるのはS3、DynamoDBのみですが、Interfaceタイプの場合も、利用料金が0.014USD/時間、データ通信料金が0.01USD/GB(※処理されるデータが1PB/月未満の場合)のため、NAT Gatewayを利用する場合と比べてかなりのコストが削減できます。 ブログ_VPCエンドポイント.drawio (1).png

S3のVPCエンドポイント(Gatewayタイプ)利用時の注意点

 VPCエンドポイント(Gatewayタイプ)を利用して、S3との通信を行う場合、注意点が2つあります。

VPCエンドポイント設定時の通信遮断

 NAT Gateway経由で接続しているS3をVPCエンドポイント(Gatewayタイプ)経由に変更する際、S3の通信は経路変更のため遮断されます。そのため、設定変更はユーザー影響が少ない時間帯に行う必要があります。

S3のバケットポリシーとVPCのエンドポイントポリシー

 S3のバケットポリシーをEIPで制御している場合は、VPC内部のPrivate IPでの制御に変更する必要があります。VPCエンドポイントを経由してS3にアクセスする場合、通信先はVPC内部のPrivate IPになるため、EIPで制御しているとVPCエンドポイントを設定しても、S3にアクセスすることができません。同様に、VPCのエンドポイントポリシーで特定のバケットへのアクセスのみを許可している場合、S3にアクセスできなくなるため、許可リストに対象のバケットを追加するなどの対応が必要になります。

結果

 EC2↔S3の通信をNAT Gateway経由ではなく、VPCエンドポイント経由としたことで、対象NAT Gatewayのコストを約70%削減することができました。

 今回はNAT Gatewayについて、コスト適正化事例をご紹介しました。
AUCでは、お客様の環境、状況に合わせたコスト適正化を進めていきます。

参考

目次

  • 実装前の課題
  • 採用した技術と理由
  • 実装した内容の紹介
  • 改善したこと(抑制できたコスト)


実装前の課題

SRE(Site Reliability Engineering:サイト信頼性エンジニアリング)とは、Googleが提唱したシステム管理とサービス運用に対するアプローチです。システムの信頼性に焦点を置き、企業が保有する全てのシステムの管理、問題解決、運用タスクの自動化を行います。
弊社では2021年2月からSRE活動を行っており、セキュリティ対策、サーバーのスケールイン/アウト運用化、アラートトリアージ運用化などを行っています。


そういったSRE活動をしていく上で、お客様から「AWSのコストを適正にしたい!」という要望を頂きました。
ヒアリングをしていく上で見えた課題が大きく分けると下記の4つありました。

①コストは月末にチェックしており、月中でコストが急激に上昇した場合発見が遅れてしまう。
② 不要なリソースが放置されていたり、新たなリリースによって生じたコストを確認していない。
③ AWSが提供するベストプラクティスによるコスト最適化が行われていない。
④ コストに対する意識が薄い。

 これらの課題からAWSコストにおける活動視点が2つ見えました。
1. AWSコストの異常値の検知(課題①、②) 
2. AWSコストの抑制活動(課題②、③、④)

2のAWSコストの抑制活動は現存する全てのAWSリソースに対して行う必要があり、手を付けやすく実装に時間がかからない1のAWSコストの異常値の検知を先に実装することに決めました。
(現在も2のAWSコストの抑制活動は継続中です。)


採用した技術と理由

 AWSコストの異常値の検知の実装をするにあたり条件として、全てのAWSサービスを監視できる、なるべく人の手が入らないような運用ができるといったようなことが考えられます。
そのような条件で調査をしていく上で、以下の2つのAWSサービスが候補になりました。
①Cost Anomaly Detection
②AWS Budgets


これらのAWSサービスを簡単に説明します。

Cost Anomaly Detection

機械学習によって平均コストからの偏差の異常値を検知しそれらの異常値を通知するシステム


AWS Budgets  

1ヶ月の予算を設定し、使用状況を追跡して予算を月中で超えた場合にアラートが発生する 


どちらのサービスがお客様の状況に合っているかを考えるために、各サービスの長所・短所を洗い出しました。

サービス 長所 短所
Cost Anomaly Detection

・コスト異常が発生した場合にすぐに通知される

・閾値を設定し超えたコスト異常のみを通知する

・どのコスト異常が検知されるかは機械学習任せ

・プロモーション時のスパイクなどの一過性の
 コスト異常も検知される

AWS Budgets

・全体のコストを把握しやすい

・実際のコストが予算の閾値に対してどのような
 状況かレポートが届く

・予算の設定が必要

・AWSサービス毎のコスト異常が検知できない


 これらの長所・短所を考慮した結果、月中での検知ができ、アカウントやサービス毎に詳細に設定ができる①Cost Anomaly Detectionを採用することに決定しました。 短所は運用でカバーすることを考え、設計しました。次の章で実装の詳細を記述します。


実装した内容の紹介

 今回実装に選んだサービスはCost Anomaly Detectionです。 主要な機能は以下の3つです。(2023年4月時点)

コストモニター

  • 機械学習により平均からの上昇値を異常値として検出
  • 検知する異常の種類は4つから選択(複数作成可能)


種類 詳細
AWSのサービス AWSで使用している各サービスについて個別で異常を検知する
連結アカウント 選択したアカウント(最大10個)の合計コストからの異常を検知する
コストカテゴリ 選択したコストカテゴリ(最大10個)の合計コストからの異常値を検知する
コスト配分タグ 選択したコストタグ(最大10個)の合計コストからの異常値を検知する


アラートサブスクリプション

  • 検出対象の通知要否に異常値の閾値($100、$1000など)を設定可能
  • アラート頻度は3つから選択


種類 詳細
個々のアラート 異常が検出された場合にすぐにアラートが表示される
通知にはAmazonSNSを使用
日次アラート 1日に一度アラートが表示される
通知にはEメールを使用
週次アラート 1週に一度アラートが表示される
通知にはEメールを使用


検出履歴

  • 異常値として検出された履歴
  • 検出を評価することでコストモニターの精度を向上させる


    以下にどのような仕組みでコスト異常を通知させるのか説明します。
     まず、平均からのコスト異常をコストモニターが機械学習で検知します。
    下図の例では2つの異常値を検知しています。

costanomaly.png


異常値の閾値として、アラートサブスクリプションに$50を設定したとします。
①の異常値は$30で閾値より低いため、通知されません。
②の異常値は$90で閾値より高いため、通知されます。
このようにして、通知されるコスト異常をフィルターすることができます。

通知された異常に関しては、CostExplorerやCloudWatchを使用して原因を解明し対処します。

 また、月の初めに検出履歴を使用し、コストモニターで検知した異常が正確なものであったか評価を送信します。
通知されなかった異常も検出履歴を送信する段階でチェックし、通知はされなかったもののインパクトが大きいものは通知されたものと同様の対処を行います。

以上の実装・運用によりコスト異常をキャッチし、コストを抑制することに成功しています。
最後の章でCost Anomaly Detectionによってコストが減少した例を紹介します。

改善したこと(抑制できたコスト)

 通知された異常としては、プロモーション時のスパイク起因による一過性のコスト上昇のものと、新しいAWSサービスのリリース起因によるコスト上昇があります。
プロモーション時のスパイク起因によるコスト上昇は一過性のものなので対処せず、新しいAWSサービスのリリース起因によるコスト上昇のみ対処します。

 検知したコストの例としては、リリース起因により月初にDynamoDBのコストが上昇し、Cost Anomaly Detectionがそのコスト異常を検知しました。
原因を調査したところ、WriteRequestが増加してることがわかり、不要な書き込みをしない実装を行い、月末に対処が終わりました。
このコスト異常は月$2500のコストであり、早期発見によって抑え込むことができました。

コスト異常検知の紹介は以上になります。

 コスト抑制活動は現在も行っており、抑制活動の一例としてはCloudWatchのログ出力が多く、不要なログ出力を削除することにより、月$4000のコスト削減に成功しています。
これらの活動により、コストインパクトが大きいリソースを対処していけば全体のコストが下がり、コスト異常検知の精度も上昇していくと考えています。

 全てのAWSリソースを最適化することは長い道のりですが、売上を上げることと同様に、コストを下げることも大事なことであるので、AWSインフラの有効活用・改善をこれからも続けていきたいと思っております。

目次

  • AUCの使用ツール
  • GitHub、CircleCI使用までの流れ
  • AWSの構成図
  • まとめ


AUCの使用ツール

弊社ではGitHubとCircleCIの2つのツールを利用し、DevOpsの概念を実現しております。
DevOpsとは、開発者(Development)と運用者(Operations)が強調することで、ユーザーにとってより価値の高いシステムを提供する、という概念です。

 開発者は、「システムへ新しい機能を追加したい」
 運用者は、「システムを安定して稼働させたい」

この2つの思いが対立することは多く、ユーザーにとって最善の価値提供を妨げる原因となります。システムにとって開発を続けることも、安定して稼働させることも重要です。
そのため、開発手法やツールを選定し、開発者と運用者が連携して、運用のしやすい開発を行うことが必要となります。

弊社では、GitHubとCircleCIの連携によりDevOpsの概念を実現し、システムによってユーザーのビジネスの価値を高め、その価値を迅速にエンドユーザーに届けております。


GitHub、CircleCIまでの流れ

弊社では、2014年からソースコードをGitHubで管理しております。ソースコードは大切な資産であるため、弊社のグローバルIPアドレス以外からのアクセスは完全に遮断したいと導入当初考えておりました。そのため、導入当初はGitHub社からライセンスを購入し、弊社で構築したAWS環境にインストールして利用しておりました。(セルフホストのGitHub)

しかし、クラウドホストのGitHubを利用されているお客様が増加したことで、弊社もクラウドホストのGitHubを利用する機会が増加しました。
一方で、IPアドレス制限を行い、セキュリティを担保する方針を変更し、全てのソースコード管理をクラウドホストのGitHubへ移行することは考えておりませんでした。

そんな中、GitHub社より、セルフホストとクラウドホストの両方を使えるプランを提案していただきました。プラン変更による追加費用が少額であったこともあり、セルフホストのみのプランから、セルフホストとクラウドホストの両方を利用できるプランに変更し、現在も利用しております。

2018年にリリースされたGitHub Enterprise 2.15で導入されたGitHub Connectは、セルフホストとクラウドホストを相互接続するツールで、セルフホストとクラウドホストの両方で必要なコンテンツの効率的な検索を可能にしました。また、GitHub Connectにより、セルフホストで運用する際の柔軟な管理機能とともに、クラウドサービスでの拡張性の両方の利点を活用できます。

そして、弊社では、CI/CDをさらに効率的に進めていくため、2018年からCircleCIを利用しております。
GitHubと同様、弊社のグローバルIPアドレス以外からのアクセスを遮断するため、CircleCIでもセルフホストを利用しています。CircleCIのセルフホストでは、自社独自のCI/CDのニーズに合わせてコンピュートオプションを拡張できます。また、システム管理者によるフルコントロール、フルカスタマイズが可能なため、セキュリティのフルコントロールや、自社のメンテナンススケジュールに合わせた更新間隔にすることが可能です。


AWSの構成図

GitHubとCircleCIの連携により、テストの自動化が可能になります。コードをコミットするたびに、CircleCIによって自動的にビルドとテストのプロセスが実行され、そのビルドのステータスがGitHubのブランチに表示されます。テスト工数の削減により、システムへの機能追加のハードルが下がります。
弊社が利用しているGitHubとCircleCIは、ともに弊社にて構築したAWS上にて動いており、お互いを連携しています。

AWS上の構成図は以下の通りです。

サーバー構成図.png

このように、弊社はGitHubとCircleCIを活用し、迅速な開発サイクルを安全に行っております。


まとめ

セルフホストは、クラウドホストに比べて利用価格が高額ですが、大切な資産であるソースコードを外部から守るという目的においては、必要不可欠なものとなります。GitHubの利用におけるホストプラン変更の例において、クラウドホストを一切利用せずにずっとセルフホストだけを利用するという選択をすることもできました。何かを変化させることは、コストも手間もかかります。しかし、弊社では、常に変化し続け、最適なものを模索していくことが重要であると考えております。変化無しには常に最適なものを模索していくことはできません。

また、弊社では、お客様の要望に対して、100%その通りに応じるのではなく、様々な影響や、本当に必要な要件は何かを考え、最善策を見つけ出すことが重要であると考えております。弊社ではこれを「お客様絶対主義」ではない、「お客様中心主義」としています。

これらの「常に変化を求める」姿勢と、「お客様中心主義」は弊社の理念の一つです。

システムを開発する上で効率化につながるツールは今後も積極的に採用していきたいと考えております。


参考文献

GitHub - GitHub Enterpriseとは
GitHub Enterprise 2.15をリリース
CircleCI セルフホストランナー
GitHubとの継続的インテグレーション

2022年卒大学生の皆さん!

コロナウイルスが流行していることで就活にどういう影響があるのか、とても不安ですよね。

今回は業界ごとに採用人数を予測し、「どの業界が狙い目なのか」機械学習を使った分析手順を紹介します!

目次

  1. 概要
  2. 手順
  3. 今後の課題


1.概要

データセットの内容

スクリーンショット 2020-08-25 9.47.11.png


分析対象の7業界・各4企業

  1. 化粧品
  2. 電子機器
  3. 商社
  4. 不動産
  5. 金融
  6. サービス
  7. IT・情報


説明変数と目的変数

特徴量
年初の株価、決算報告書提出翌日の株価、一株あたりの純資産額、従業員数、業界番号
決算報告書翌日の株価が出ていないところは提出後直近の株価を使用する。また、純資産額に関しては決算報告書が7/1の時点で未提出の場合に限り、昨年の値を使用する。


目的変数
採用人数
新卒採用人数は、リクナビorマイナビorキャリタスのデータを使用する。  

2.手順

今回は方法の紹介を行う。


欠損値の補完

従業員数
過去2年分の従業員数の変化率を使う。
例えば、2018年と2019年の従業員数の変化率を使って2020年の従業員を補完する。


株価
①複数企業での、同じ年代の1月株価と通期決算報告翌日の株価の変化率の平均を使う。
 例えば、リクルートの2018年の1月株価と決算翌日の株価の変化率をA、東京海上日動の2018年の変化率をBとする。ミクシィの2018年の決算翌日の株価を求めたい時(1月株価は既知)、AとBの変化率の平均値を1月株価に掛けて補完する。
②1月株価の値と決算翌日の株価の値、どちらも未知の場合は行を削除する。


純資産
直近の純資産で補完する。


モデル

回帰分析
回帰分析して、業界ごとの採用人数の平均値をとる。
説明変数:従業員数、株価(決算報告翌日)、業界、純資産
目的変数:採用人数


クラスタリング
①従業員数、純資産を複数の範囲に分けて数字or文字に置き換える。
 例えば、従業員数3000以下は「1」、3001〜5000を「2」で置く。
②①で数字に置き換えた二つのカラムを使い、純資産÷従業員数で得た結果を新しいカラム[value]に入れ込む。
③株価と採用人数も①同様に複数の範囲に分けて数字or文字に置き換える。
④数字で複数個の範囲に分けた採用人数を「down」「stay」「up」の3つのグループにまとめる。
説明変数:「value」「株価(決算報告書提出翌日)」
目的変数:採用人数


今後の課題

今回は5つの特徴量のみで行ないましたが、もっと良い特徴量があるかもしれません。 また、データ数が少なく欠損値が多かったため、期待する制度に満たない可能性があります。

精度を向上のためには、特徴量・企業のデータ数を増やすこと、欠損値の補完方法を変えるなど、様々な方法があります。今後はモデルの実装も含め行います。

目次

  • 機械翻訳とは
  • 機械翻訳の手法
  • 現在の機械翻訳の欠点
  • 欠点が改善されると
  • 今後の展望


機械翻訳とは

機械翻訳という言葉を理解するために2つ言葉を定義する。

系列 : 記号の列のことで自然言語処理の世界だと文を構成する単語の列になる。
系列変換モデル : 系列を受け取り、それを別の系列に変換する際の確率をモデル化したもの。系列変換モデルはseq2-seqモデルとも呼ばれている。

この2つの言葉から機械翻訳は、ある言語の文章(系列)を別の言語の文章(系列)に変換する方法論の総称のことをいう。例えば、日本語の文章という系列を英語の文章という別の系列に変えることである。特に、系列変換モデルの考えを使った機械翻訳をニューラル機械翻訳と呼ぶことがある。


機械翻訳の手法

歴史的には、以下のような翻訳方法がある。


ルールベース翻訳

登録済みのルールを適応することで原文を分析し、訳文を出力する機械翻訳の方法。ここでいう「ルール」は、各言語の「文法」に置き換えられる。定めたルールに則っていなければ翻訳ができないが、則ってさえいればしっかりと翻訳可能である。現在は、旧時代的な機械翻訳方法として認識されている。 ルールに基づく機械翻訳の基本になるのはルールである。ルールによる構文解析の仕組みを、ツリーによる機械翻訳の例を挙げる。

まず以下のルール

NP → ART N (名詞句 は 冠詞 名詞 で構成される)
VP → V NP (動詞句 は 動詞 名詞句 で構成される)
S → NP VP (文 は 名詞句 動詞句 で構成される)


を使って以下の英文を解析してみる。

A client sent the form


ルールベース機械翻訳では、辞書もルールとして扱う。理論を考える場合だけでなく、実用的な機械翻訳システムを設計する場合にも辞書をルールとして扱うほうが良いとされている。ここでは、辞書として以下のルールも用意する。

ART → a (冠詞 は a で構成される)
ART → the (冠詞 は the で構成される)
N → client (名詞 は client で構成される)
N → form (名詞 は form で構成される)
V → sent (動詞 は sent で構成される)


まず、原文にある単語それぞれの品詞を判定する。

ART - a
N - client
V - sent
ART - the
N - form


次に、当てはまるルールを探して順次適用する。左端のARTとNに

NP → ART N (名詞句 は 冠詞 名詞 で構成される)


が当てはまるため、左端のARTとNからNPを作れる。

MT_01.png


同様に、右端のARTとNからもNPを作れる。

MT_02.png


次に、

VP → V NP (動詞句 は 動詞 名詞句 で構成される)


を当てはめることができ、VとNPからVPを作れる。

MT_03.png


最後に以下のルール

S → NP VP (文 は 名詞句 動詞句 で構成される)


が当てはまるため、NPとVPからSを作れる。

MT_04-1.png


これ以上適用できるルールはなく、最終的な目標としていた文 (S) を検出できたので、これで解析成功である。最終的に、原文の構造を表すツリーを作ることができる。


用例ベース翻訳

入力文の各部分に対して類似した用例を選択し、それを組み合わせて翻訳を行う。
この方法はほかの方法よりも自然な翻訳文の生成が可能であると考えられている。理由としては、人間も翻訳する際に様々な用例から翻訳をしているからである。また、用例の追加により容易にシ ステムを改善可能である。

しかし、用例ベース翻訳は入力文や用例を解析するのに高精度なものを必要としているが、十分な精度をもつものが存在しなく、用例ベース翻訳は実現されていなかった。現在は木構造により用例ベース翻訳は研究されている。

原文を解析して木構造を作り、その木を置き換えながら翻訳する。
下図のように木構造を作る。

原文: OK button sends the form to the remote server.
訳文: [OK] ボタンはフォームをリモート サーバに送信する。

MT_05.png


このようにして、様々な用例パターンを抽出している。この方法は、日本発祥である。

必ずしも文法に従って原文を解析する必要はないが、ツリー構造を使うと柔軟な翻訳が可能である。
この方法の長所は先ほどのルールベース翻訳のように膨大な量のルールを機械に覚えさせる必要がない点である。


統計翻訳

コンピュータに学習用のコーパスを与え、統計モデ ルを学習させることで訳文を出力させる方法。ルールベース機械翻訳の弱点をカバーするとして、注目された方法である。

具体的には、対訳コーパスという、例えば日本語でよくある言い回し

0001
日: Xではないかとつくづく疑問に思う
英: I often wonder if it might be X.
中: 难道不会是X吗,我实在是感到怀疑。
1000
日: 私はXを視野にしっかり入れています
英: I put more focus on X.
中: 我非常重视X。
2000
日: 彼がレストランで昼食をとる
英: He eats lunch at a restaurant.
中: 他在餐馆吃午饭。


を英語や中国語に翻訳した大量のコーパスから学習をし、評価対象の文を翻訳する方法である。 統計翻訳において統計的モデルを学習するアルゴリズムは、言語に依存しないため、大量の対訳データがあれば多言語化が容易であり、開発コストを抑えることが可能である。


現在の機械翻訳の欠点

系列変換モデルに基づくニューラル翻訳システムの弱点の1つに、語彙数の問題がある。扱う語彙数を多くすると計算量が大きくなりすぎて現実的な速度での学習や評価ができなくなる。
また、語彙数が多くなるということは、語彙選択問題がより難しくなるため、不用意に語彙を増やしても翻訳精度が低下するだけということも起こる。

さらに、イベント名など時間とともに新語が出現するので、本質的に未知語を完全になくすことは不可能である。機械翻訳タスクでは未知語をどのように扱うかは永遠のテーマとなっている。
統計翻訳時代の考え方から、未知語と判定されたものを後処理で何かの語に置き換えるという方法が用いられている。いくつかの論文の実験セクションでは「RnkRep」のような用語を使ってその結果を示して いる。

一方、ニューラル翻訳に移行してからは、新しい考え方も使われるようになった。
1つは、入出力の単位を「単語」ではなく「文字」にしてしまう方法である。「文字」であれば使われる文字集合は事前に網羅できかつ、新語に比べて新文字の出現は限りなく低いことから、増えることはないという仮定ができる。一方、個々の文字選択問題が簡単になっても、系列長は単語の時と比べて圧倒的に長くなるので、そちらで予測誤りが多くなる問題が発生する。

次に、文字単位はあまりにも細かすぎるという考え方から、文字単位と単語単位の丁度中間に相当する方法論として、バイト対符号化という方法も提案されている。この方法はニューラル翻訳を行う前処理とし て、与えられたデータを使い出現頻度が最も大きい文字ペアを1つの文字としてまとめるという処理を事前に決めた語彙数まで繰り返し処理する。これで得られた文字の結合ルールは、未知の文に対しても、得られた順番で適用していけば、必ず一意に同じ符号化された文を獲得するこ とができる。

文字単位、単語単位、バイト対符号化の 3 種類のうち、どれが総合的に優れているかは決着がついていないが、最近はバイト対符号化が良いのではないかということが言われている。


欠点が改善されると...

未知語に関しての欠点が改善されると、扱う語彙数をうまくコントロールした翻訳が可能になる。

扱い語彙数が多くなると計算量が多くなるため、現実的な速度で計算が不可能であったが、語彙数をうまくコントロールし翻訳をすれば、計算速度が速く、語彙選択問題も簡単になることから高精度に翻訳が可能であると考えられる。
さらに、翻訳をするために高性能なコンピューターを必要としていたが、計算量を減らすことで、安価なコンピューターを用いても高性能な翻訳が可能になるだろう。


今後の展望

機械翻訳タスクは、現在の自然言語処理分野の深層学習/ニューラルネットワーク研究の中心的な位置を占めていると考えられている。

多くの研究成果が報告されており、どの技術が最終的に生き残るか現状見極めるのが難しい。しかし、2015年、2016年で、系列変換モデルによるニューラル翻訳の基礎的な理論が出来上がり、統計翻訳よりも有意に良いと認められるに至っている。研究の余地は非常に多く残されている研究領域であり、独自技術を開発する必要があると考えられている。
機械翻訳がさらに発展すると以下のことが実現するだろう。

コストを抑えてスピーディーな翻訳が可能
機械翻訳の最大のメリットとして、よりスピーディーに、コストを抑えた翻訳が可能になったという点が挙げられる。翻訳速度が速い翻訳家に依頼しても、英文の日本語訳の場合、1日1500〜2000語が目安といわれている。しかし、人間が8時間かけて翻訳する作業を、Google翻訳は数十秒足らずで処理してしまう。さらに、翻訳家に翻訳サービスを依頼すると、一文字5円の場合、2000文字の英文の翻訳に10,000円かかるのに対し、Google翻訳なら、100を超える言語を無料で翻訳が可能である。


翻訳結果を文書として残せる
ビジネスの世界では、文書の配布や、保管、管理を行うために記録として残す必要があり、正確さも求められる。こうした場合、文書から別の言語の文書に翻訳できる機械翻訳が適している。ポストエディットという言葉があるが、これは機械翻訳を利用した後に行われる人間の翻訳者による修正作業のことである。機械翻訳が発展したらポストエディットの作業も徐々に減っていくと考えられ、人間が行う作業を効率的に減らすことが可能である。


参考文献

深層学習による自然言語処理 坪井祐太/海野裕也/鈴木 潤・著
ニューラル機械翻訳以前を支えた「ルールベース機械翻訳(RMT)」と「統計的機械翻訳(SMT)」
ルールベース機械翻訳の概要 (4)
用例ベース機械翻訳の概要 (1)
機械翻訳と自動翻訳に違いはある?使い分けはどうすればよい?

こんにちは。

皆さんはFXでお金を稼ぎたいと思ったことはあるでしょうか?もしFXでこれまでの生活を一変させるような額のお金を稼ぐことができたら夢のようですよね?

今回はそんな夢を目指して、為替の値動きを機械学習で予測してみたというお話をしたいと思います。


目次

  1. 概要
  2. 手順
  3. 結果
  4. 今後の課題


1 概要

  • 使用したデータセット:OANDA APIを用いて取得
    https://www.oanda.jp/fxproduct/api
    (デモ口座を開設することにより、無料でAPIを利用することができます)

  • 使用したモデル:LSTM

データセット
米ドル円の2016年9月22日から2020年7月20日までの1000個の日足データを取得し利用します。

スクリーンショット 2020-07-21 14.27.04.png
今回は、open(始値)、close(終値)、high(高値)、low(安値)、volume(取引量)という基本的な特徴量を用います。

LSTMとは?

 LSTMは時系列予測をするためのライブラリです。
LSTM(Long short-term memory)は、RNN(Recurrent Neural Network)の拡張として1995年に登場した、時系列データに対するモデル、または構造の1種です。その名前は、Long term memory(長期記憶)とShort term memory(短期記憶)という神経科学における用語から取られています。 ニューラルネットワークは過去の出来事を考慮することができず、RNNは長い記憶に対応できないという欠点があります。そこで長い過去の記憶を考慮できるように、LSTMが開発されました。 今回は5日分のデータを1セットとしてLSTMで予測をしました。
つまり、5日間の為替レートのデータを1セットとして、それを何セットも学習することで、新しい5日間のデータからその次の為替レートを予測していきます。


2 手順

 今回為替予測をするにあたって行った手順について簡単に説明します。  

  1. データセットの準備
       OANDA APIを用いて取得する

  2. データの加工
      ・データセットの「time」の部分が特殊な形(「ISO 8601」)を日本時間に直す
      ・データを学習データと訓練データに分割する
      ・LSTM用にデータを変換する
       絶対的な為替価格ではなく、どのように為替価格が変化し、どの程度価格が変動するかを見る変化率に直す
      ・PandasのデータフレームからNumpy配列へ変換する

  3. LSTMのモデル構築と学習・予測
      ・機械学習ライブラリのKerasを利用してモデル構築を行う
    (Kerasについてはこちらをご覧くださいhttps://keras.io/ja/
      ・モデルの訓練を行う
      ・作成したモデルを用いて、予測をする


3 結果

 2のところで紹介した手順で為替の予測を行ってみました。結果をチャートにしたものがこちらです。

スクリーンショット 2020-07-31 8.54.42.png
青のラインが実際の為替の値動き、赤が今回予測した為替の値動きです。

どうでしょうか。それっぽいものができていると思いますが、チャートをみてみると最初の方で大きく外しているほか、気になるのが、実際の値動きの後に遅れて予測したものが動いている点です。実際にレートが動いてから予測結果が出るため、エントリーのタイミングを逃してしまう可能性があり、各個人での判断が必要となってしまいます。


4 今後の課題

 今回は一日の為替価格のみのデータで分析をしました。為替の値動きは、様々な経済指標やトランプ大統領の発言、1日の中の時間帯によっても変わっていくので、そのようなニュースの情報やTwitterなどの情報も取り入れたらさらに精度の高いものが出来上がるのではないかと思います。
 FXトレーダーは、自分なりにチャートを分析し、何らかの基準を持ってトレードをしています。彼らのノウハウや経験をうまく機械学習に落とし込めれば、同等、またはそれ以上の精度で予測できるのではないかと個人的には思います。
 引き続き機械学習を用いた為替予測を頑張っていきたいです!

皆さんはレポートを作成する際、どのような方法で作成していますか?

膨大な量のデータを読み解き、文章を考えて、何かうまくまとまらない...... もっと簡単にできたらいいのに!と思ったことはありませんか?

この記事では、Arria NLG PLCのデータから文章を生成する技術について紹介します。


1 ARRIA NLG PLCとは?

ARRIA NLG PLCは2009年に設立した企業です。しかし、その技術は30年間の科学的研究に基づいたもので、ARRIA NLG PLC ホームページではこのように紹介しています。

『ARRIA NLG PLCは、自然言語生成(NLG)として知られる人工知能(AI)分野におけるグローバルリーダーです。Arriaは、Arria NLGプラットフォームを介して利用可能な、特許取得済みのコアNLGテクノロジーを所有、開発、およびライセンス供与しています。Arria NLGプラットフォームの中心は、世界で最も先進的な自然言語生成エンジンであるArria NLGエンジンです。』(ARRIA NLG PLC ホームページより)  


2 NLGとは?

 NLGとは、自然言語生成(Natural Language Generation)のことであり、自然言語処理の一種で、文・画像など様々な表現を入力として、最終的に自然言語文を出力とする処理のことです。


3 ARRIA NLGエンジンの仕組み

Raw Dataを取り込み、Narrative Explanationを出力します。

Untitled Diagram.jpg

Raw Data
構造化および非構造化の両方のさまざまなデータソースから取り込む

Data Analysis and Interpretation
データを処理し、重要な事実を抽出、解釈する

Document Planning
データから派生したメッセージを受け取り、メッセージに含まれる情報を含む上手な文章を構築する方法を考え出す

Micro-Planning
流暢さと一貫性を最大化するために情報をまとめ、文章化する方法を考え出す

Surface Realisation
正しい文法、単語の選択、形態、句読点を用いた文章構成となるようにする

Narrative Explanation
さまざまな形式(HTML、PDF、Wordなど)で出力することができ、必要に応じてグラフィックスとの組み合わせや音声での配信も可能


4 ARRIA NLGの利用方法

  • レポート作成の自動化
  • データの可視化による意思決定支援
  • レポートの作成と送信の高速化


5 ARRIA NLGの活用

 ARRIA NLGのテクノロジーは天気の分野や金融分野をはじめ、様々な分野に利用されています。

 NLGシステムで使用されるデータは、株価、会社の利益、降雨量、気温、雇用統計などの時系列データです。データは空間的である場合もあり、場所による変動(異なる地理的領域での降雨など)を示したり、時空間で両方の次元の変動(たとえば、異なる地理的領域での時間による降水量)を組み合わせたりします。NLGの目的は、生データのコンテンツをユーザーがよりアクセスしやすくすることにより、付加価値を与えることです。まず、データのパターンと傾向を検出することで、何が起こっているのかについて、生データを見るよりもユーザーが捉えやすくなります。 


6 ARRIA NLGの活躍

 Arria NLGは様々な企業と提携し、そのテクノロジーを社会のために活かしています。以下は最近ニュースになった話題について紹介します。  

『自然言語生成(NLG)テクノロジーの有力プロバイダーであるArria NLGは20日、Glemser Technologiesと提携し、医療・製薬企業にスケーラブルな自動化ソリューションと大幅な効率性を提供すると発表した。GlemserはArriaのテクノロジーで駆動されるNatural Language Generationソリューションによって、世界で展開する同社のライフサイエンス業務を強化する。』(ニューヨーク2020年5月20日PR Newswire=共同通信JBN)


『自然言語生成(NLG)テクノロジーの有力プロバイダーであるArria NLGは6日、バンク・オブ・ニューヨーク・メロン・コーポレーション(BNY Mellon)と提携し、アセットマネージャーおよびアセットオーナーがデータをアクショナブルアナリティクスに変換することを支援すると発表した。BNY Mellon Data and Analytics Solutionsのクライアントは今、自然言語生成の能力を通じてデータからより良い知見を引き出すことが可能になる。』(ニューヨーク2020年5月6日PR Newswire=共同通信JBN)


『Arria NLGは17日、BBCニュース・ウェブサイトが同社のSemi-Automatic Local Content(Salco)プロジェクトを通じて、Arriaの自然言語生成(NLG)プラットフォームの使用を拡大し、英国で行われた総選挙のニュース報道を自動化したと公表した。 BBC News Labの目標は、総選挙の夜にそれぞれの契約者向けに地元の開票集計・結果が入った地域ごとに編集されたニュースを報道する能力を拡大することだった。Arria NLGによって、この巨大メディアは英国歴史上最も多忙なニュースの夜に、それぞれの人口動態に関する地方データを提供してその目標を達成するとともに、多数の記事の報道に成功した。』(モリスタウン(米ニュージャージー州)2019年12月17日PR Newswire=共同通信JBN)

引用:プレスリリース/ニュースリリース配信の共同通信PRWire(https://kyodonewsprwire.jp/author/H100002)


7 おわりに

今回は、機械学習海外活用事例としてARRIA NLG PLCの自然言語生成技術を紹介しました。この技術は文章作成という個人的な身近な問題を解決するだけではなく、様々な分野で人々の役に立つ技術だということがわかりました。この技術はもっと社会に広がっていくと考えられます。今後のさらなる活躍が楽しみですね!


出典:

『TECHNICAL OVERVIEW: THE ARRIA NLG ENGINE
『Arria NLG』


Twitter・Facebookで定期的に情報発信しています!

新型コロナウイルス感染症とは?

2019年12月より中国で 新型コロナウイルス ( COVID-19 )による肺炎が発生し、2020年4月現在では日本国内でも急速に感染が拡大しています。

新型コロナウイルスは、感染症法における「 指定感染症 」、及び検疫法における「 検疫感染症 」に指定され、感染が確認された患者に対して入院措置などの法的処置を取ることが可能となりました。

今回は、まず感染の拡大等を予測できる感染症モデルについていくつか紹介していこうと思います。また、感染症拡大の指標である基本再生産数・実効再生産数についても、実際のコロナウイルスのデータを用いてみていきます。


感染症モデルと基本再生産数・実効再生産数

これまで私たちは、新型コロナウイルスをはじめとする様々な危機にさらされてきました。それを機に感染症の流行を抑えるべく、感染者の隔離による感染個体との接触回避や、ワクチン接種による免疫力の向上など様々な対策を講じてきました。一方、感染症の流行のメカニズムを定式化することにより得られる、感染症の数理モデルによる感染症の流行規模の予測も注目されています。

感染症の数理モデルとは、簡単に言うと「感染症がどのように伝播し、感染した人がどの程度の期間で発症し、どの程度の期間で回復するのか」といったプロセスを、数式によって記述したものです。

感染症モデルにも、そのプロセスをどのように仮定するかにより様々なものが存在します。今回はその中のいくつかを紹介していきます。


SIR model

SIRモデルは、感染症モデルの中で基本となるモデルで、原形はKermack-McKendrick(1927)によるモデルです。

 このモデルは、対象とする全人口を

  • 感受性保持者(Susceptible):感染症への免疫がなく、これから感染する可能性がある人
  • 感染者(Infectios):感染症に現在感染している人
  • 免疫保持者(Recovered):感染症から回復して免疫を持った人もしくは死亡した人


の3つの状態に分かれると仮定し、集団に感染症が広がる様子を表したモデルで、時間経過によるそれぞれの状態の個体数の増減を考えています。

ここでは感染症にかかった少数の人が、感染症にかかる可能性のある大きな集団と接触した場合を想定しています。

SIR.png

SIRモデルは以下の微分方程式により定式化されます。

スクリーンショット 2020-04-30 9.30.08.png

ここでS(t)、I(t)、R(t)はそれぞれ時刻tでの感受性保持者数、感染者数、免疫保持者数を表していて、微分方程式のそれぞれの式は微小時間での個体数の増減を数式化したものです。感受性保持者から感染者となる推移は両者が接触することを想定していることから、感受性保持者の減少及び感染者数の増加を表す式は、感受性保持者数と感染者数の積を用いて表現されています。

また、βは感染伝達係数、つまり感染率を意味するパラメータで、この値が大きいほど人から人へと感染しやすいこと表しています。

γは回復などで感染者でなくなる割合を表していて、感染症が治りやすければこの値も大きくなります。 ここで感染症が流行するというのは、モデル中のI(t)が増加することで、その条件は上のI'(t)の式から求めることができます。 初期値をI(0)、S(0)として、

sir2.png

が正のとき、つまり
スクリーンショット 2020-04-30 9.50.45.png

のとき、I(t)は初期時刻からの微小時間では単調増加で、ある時刻で最大値を取ります。最大値に到達した後は単調減少で0に収束していきます。 この値は基本再生産数と呼ばれます。ここで、基本再生産数について実効再生産数とともに簡単に説明したいと思います。


基本再生産数と実効再生産数

 基本再生産数とは、1人の感染者が感染力を失うまでに平均して何人の感受性保持者に直接感染させるのかという人数で、どの程度感染を広げる可能性があるかを示しています。 これは、

基本再生産数 =(単位時間あたりの2次感染者数) ×(平均感染期間)
       = 1次感染者が感染期間中に生み出す2次感染者数 と表すことができます。 またSIRモデルの式から、基本再生産数は
R0.png
と表せます。

この値が
スクリーンショット 2020-04-30 9.44.44.png
のとき感染症の流行が発生します。

基本再生産数を計算する一例を紹介します。

r0_cal-1.png

この図は、赤い丸が一人の感染者を表しています。一番左の時点を第1世代とし、その感染者が新たな感染者(第2世代)を生み出すとし、ここでは第6世代まで広がるとしています。一人の感染者が生み出す新たな感染者数は異なり、これが多いほど感染力の高い感染症であるとも考えられます。 ここで基本再生産数は

(全世代の新規感染者数)÷(世代数) で求めることができます。

ここで注意しなければならないのは、一般に基本再生産数の値は、一切対策を取らなかったときに感染症がどの程度感染を広げていく可能性があるのかを示すということです。

実効再生産数とは、感受性固体の一部が免疫化された集団の再生産数のことで、簡単に言うと、感染拡大しないように対策を取ったときの実際の再生産数のことです。感染症の流行を抑えるために、拡大防止対策を講じ、理論的には実効再生産数の値が1を下回れば感染の流行を収束に向かわせることができます。収束に向かわせるといっても、その期間の新たな感染者数が減少するということで、感染症が収まってなくなるというわけではありません。感染症の最終的な収束には、実効再生産数が大きくなりすぎないように対策を講じながら、集団免疫を獲得するかワクチン等の開発を待つ必要があるそうです。

基本再生産数の取る値により感染者数の増減はどのように異なるのでしょうか。

まず、基本的なSIRモデルの挙動は以下のようになります。

sir_g.png

ここで注目するのは基本再生産数の値を40(β=0.2)のときと、4(β=0.02)のときの感染者数I(t)の推移を見てみます。

またγ=0.05、S(0)=10、I(0)=10とします。

I_beta.png

このグラフから、基本再生産数の値が大きくなると感染症の広がりが速くなり、そのピーク時の感染者数の最大値も大きくってしまうことが分かります。つまり、何も対策を取らなければ、感染症は急激に広がり、同時期に多くの感染者が発生してしまうのです。

次にSIRモデルから派生したSEIRモデルについて紹介します。


SEIRモデル

SEIRモデルとは、SIRモデルの3つの状態に加えて、潜伏期感染者(Exposed)を考えたモデルです。

つまり、対象とする全人口を

  • 感受性保持者(Susceptible):感染症への免疫がなく、これから感染する可能性がある人
  • 潜伏期感染者(Exposed):感染症に感染したが潜伏期間で、感染力がない人
  • 感染者(Infectios):感染症に現在感染している人で、感染力がある人
  • 免疫保持者(Recovered):感染症から回復して免疫を持った人もしくは死亡した人


の4つの状態に分かれると仮定し、集団に感染症が広がる様子を表したモデルで、時間経過によるそれぞれの状態の個体数の増減を考えています。 今回のコロナウイルスを簡単に見るときにはSEIRモデルがよく使われているような印象です。

SEIR.png

SEIRモデルは以下の微分方程式により定式化されます。

SEIR_equ.png

ここでS(t)、E(t)、I(t)、R(t)はそれぞれ時刻tでの感受性保持者数、潜伏期感染者数、感染者数、免疫保持者数を表していて、微分方程式のそれぞれの式は微小時間での個体数の増減を数式化したものです。ここでSIRモデルで無かったパラメータσは潜伏期間から感染状態へ移行することを表す係数で、単位時間あたりの発症率を表します。

SEIRモデルの挙動は以下のようになります。

SIR_graph.png

次にSISモデルについて説明します。


SISモデル

SISモデルは、感受性保持者(Susceptible)と感染者(Infected)の2つの状態のみを考えます。感受性保持者から感染者へ移行するのはSIRモデルと同じですが、SISモデルでは感染してから回復した後に免疫を獲得せずに、再び感受性保持者になり、感染の可能性がある状態へと移行すると考えています。

SIS.png

SISモデルは以下の微分方程式により定式化されます。

SIS_equ-1.png

ここでS(t)、I(t)はそれぞれ時刻tでの感受性保持者数、感染者数を表していて、微分方程式のそれぞれの式は微小時間での個体数の増減を数式化したものです。また、ここで出てくる係数はSIRモデルと同じです。SIRモデルと比べると、感受性保持者から感染者へと移行する様子が良く分かると思います。

SISモデルの挙動は以下のようになります。

SIS_graph.png

グラフを見て分かるように、ある程度まで感染者が増えると、感受性保持者と感染者の数が一定になります。つまり一定になってからは、感受性保持者と感染者の状態を一定数が行き来しているということになります。

これらの感染症モデルを見ていると、感染症による状態の遷移をどのように仮定するかでモデルが決まることが分かると思います。これら以外でも、違う仮定をすることで感染症モデルは提案がされていますし、感染症ごとにモデルを検討されることもあると思います。

感染症モデルを用いることで、感染症が出てきた段階では、どの程度広がっていくのかスピード等も考慮しながら予測することができ、対策を講じる際に利用することができます。また、対策を講じた後もどの程度効果があったかや、その先対策を講じながらの感染者の推移について予測する際にも用いることができます。

また実際に感染がどの程度抑えられているかは、実効再生産数を算出することで確認できます。


コロナウイルスデータの実効再生産数の推移

実際のコロナウイルスの感染者数データから、実効再生産数の推移を見ていこうと思います。実効再生産数については上で紹介しましたが、計算法についてはいくつかあるようで、今回はCoriらの論文にあるエクセルシートを使いました。データについてはsignateのCOVID-19 Challengeで与えられている都道府県ごとの感染者数データを使っています。本来、実効再生産数を計算する際には検査数等も考慮する必要があると思いますし、実際に専門の方が計算するのとは差があり、あまり正確な値ではないので、参考程度に考えてください。

ここで推移を見るのは、北海道・東京・大阪・愛知としました。愛知県のみ、5月14日で緊急事態宣言が解除されています。(5月19日時点)

hokkaido.png

tokyo.png

osaka.png

aichi.png

グラフを見るポイントは、実効再生産数が1未満に抑えることができているかということです。それぞれ見ると5月19日時点で、すべて実効再生産数1を下回っているので、感染の広がりをうまく抑えられているように思います。

推移の中で、実効再生産数が1を下回り安定し始めたの日は、北海道が5月5日ごろ、東京・大阪が4月21日ごろ、愛知が4月15日ごろとなっています。一足先に緊急事態宣言が解除された愛知が、少しですが他よりも早く実効再生産数が下がった印象です。また東京・大阪にくらべて、北海道は実効再生産数が1未満に下がるのが遅い印象なので、緊急事態宣言の解除等に影響してくるかもしれません。

あくまでも参考値であるものの、今回見た地域では実効再生産数が5月19日時点で1を下回って少し落ち着ているので、少しずつ自粛緩和 は進んでくるとは思います。ただしグラフを見て分かるように、少し前の時期には実効再生産数が1を大きく上回っています。また、今の状況というのは強めに自粛を呼び掛けての結果ですので、実際に少し前の時期には実効再生産数が1を上回っていた事実をデータから受け止め、簡単にその状態に戻ってしまうことを肝に銘じておく必要があると思います。


まとめ

今回はコロナウイルスの流行により注目されている感染症モデル等について紹介しました。日々状況が更新される中で、実効再生産数等はこれからも対策をとる一つの指標となるので、正しく理解することが大切です。


Twitter・Facebookで定期的に情報発信しています!

世界で猛威を振るうコロナウイルスの抑制に向けて、AI・機械学習はどのような貢献ができるでしょうか。

政府、研究者、保健機関を支援するための早期警告、および検出アルゴリズム、患者の旅行履歴に基づく分析、そして最終的にはコロナウイルスワクチンの作成および開発まで、AIはおそらく鍵となるテクノロジーになるでしょう。今回はAI・機械学習での貢献にチャレンジしている事例を紹介します。


機械学習によるウイルスの検出と追跡

たとえば、カナダに本拠を置く病気の分散予測プラットフォームBlueDotが実際にコロナウイルスの発生を特定したのは、米国疾病対策センターからの公式警告があった5日前の 2019年12月31日でした。BlueDotのアルゴリズムは、自然言語処理と機械学習を使用して、65か国語のニュースレポートを、航空会社のフライトデータと動物の病気の発生レポートとともに分析します。システムはこれらのレポートをふるいにかけることにより、感染した住民がどこに、いつ移動する可能性が高いかを特定し、ウイルスが武漢からバンコク、ソウル、台北、東京に広がるのではないかと予測しました。

機械学習は、コロナウイルス曝露の可能性について旅行者をスクリーニングするためにも利用されています。
マレーシアの電子サービス会社MY EG Services Berhadは、中国の旅行会社であるPhoenix Travel Worldwideとともに、入国しようとしている中国観光客ががコロナウイルスに曝された可能性があるか、またはその危険性があるかどうか判断するため、AIがリスクを分析するソリューションを展開しています。このソリューションの機械学習アルゴリズムは、いくつかのデータポイント(以前いた場所、心拍数、血圧など)を利用して分析・予測をしています。


治療計画の作成

ウイルスの追跡以外にも、AIはワクチンの開発や治療に利用されています。
Insilico Medicineは、香港に本拠を置くAIを活用した創薬会社で、コロナウイルスと戦うことができる可能性がある分子化合物を無料公開しています。このテクノロジーは機械学習を使用して特定の分子の特性とそれらがウイルスと相互作用する方法を分析しています。結果に対して薬学者からのフィードバックを求め、ワクチン開発機関の短縮に貢献することを目指しています。


おわりに

貢献の成果が出るのはこれからかと思いますが、複数のソリューションがスピード感を持って開発されています。中国で話題になった「マスクマップ」に続くソリューションが今後も生み出されていくでしょう。

KaggleやSIGNATEでもコロナウイルス分析へのコンペが開催されています。当社インターンでも結果を公開できるように進めています。


Twitter・Facebookで定期的に情報発信しています!

最近、「機械学習って何が出来るの?」「AIとなにが違うの?」という質問を多くいただくようになってきました。それもそのはず、5年間で機械学習の検索ボリュームは約3倍になりました。


picture_pc_acac8dea3e6eddac84c73fa1e8673294.png


機械学習の概要やどんな課題解決ができるのか、事例をご紹介します。


目次

  1. 人工知能(AI)とは
  2. 機械学習とは
  3. 機械学習の種類
  4. 機械学習の歴史
  5. 解決したい課題別 機械学習の活用事例
    コスト削減/人依存の解消/生産性向上/品質向上
  6. 導入検討フロー


人工知能(AI)とは

人工知能のイメージは人によって大きく違います。人工知能が「推論・認識・判断など、人間と同じ知的な処理能力を持つ機械(情報処理システム)」であることは大多数の研究者たちの意見も一致していますが、それより細かい定義については専門家たちの間で共有されている定義はありません。「人間と同じ知的な処理能力」の解釈がそれぞれ異なるからです。

専門家の定義が定まらないため、一般のイメージはなおさら曖昧です。イメージしやすいものは、お掃除ロボットや自動運転のようにシステムが自ら考えて行動しているように見える、周りの環境に応じて自らの行動を変えられるものでしょう。

なにができるか、といった視点から人工知能を分類し、解説します。


picture_pc_01038c560b5f79fb84172f99dc3846d5.png


1.ルールベースでの制御

エアコンの温度調整など、予め行動が決まっている製品が当てはまります。制御工学やシステム工学と呼ばれ、人工知能には当てはまりません。

2.古典的な人工知能

掃除ロボットや診断プログラムなど、探索・推論・知識データを活用し、状況に応じて振る舞いを変える製品です。既に広く実用化されており、機械学習・深層学習の研究の先駆けです。

3.機械学習

検索エンジンや交通渋滞予測など、大量のサンプルデータを元に入力と出力の関係を学習した製品です。古くから研究され、2000年代に入り、ますます発展しています。

4.深層学習(ディープラーニング)

機械学習では、学習対象の「どのような特徴が学習に影響するか(特徴量)」を見極めることは非常に重要で難しいです。例えば、売上予測をする際にその日の天気が重要、と分かっていると効率的に学習が進められます。 この特徴量を自動で学習するシステムが深層学習です。画像認識、音声認識、自動翻訳など、従来のコンピュータで実現が難しいとされてきた分野での応用が進んでいます。


機械学習とは

機械学習とは、コンピュータにデータを与え、アルゴリズムに基づいた分析をさせる手法のことです。事例となるデータを反復的に学ばせて、特徴やパターンを見つけ出します。見つけた特徴を新しいデータに適用することで分析や予測を行います。 解きたい課題によってそのアプローチは様々です。機械学習にも得意不得意があり、どのような課題であれば機械学習で解決できるのかを知っておくことが重要です。

機械学習が対象とする課題の種類は次の3つにまとめられます。

教師あり学習

与えられたデータを元にそのデータがどんなパターンになるか予測・識別するものです。例えば

  • 過去の受注データから未来の受注を予測したい
  • 写真がどの動物か識別したい
  • 英語の文章を日本語に翻訳したい


といった活用ができます。つまり、与えられたデータ(入力)と返す答え(出力)にどんな関係があるかを学習する手法です。
また、受注予測のように連続したデータの予測は回帰、写真の識別のようにカテゴリを予測するものは分類といいます。

教師なし学習

教師あり学習では、入力データと出力データが対になっていましたが、教師なし学習は出力データがありません。教師=出力データですね。例えば

  • 顧客層がどのようなものか知りたい
  • 膨大なデータの項目間の関係性を知りたい


このようにデータに意味をもたせたい時に活用されます。

強化学習

強化学習は教師あり・なし学習とは少し異なり、「行動を学習する仕組み」とよく表現されています。ある環境下で、目的とする報酬を最大化するための行動はなにか、を学習していきます。例えば

  • パックマンの行動最適化
  • プロ囲碁棋士を破ったコンピュータ囲碁(Aipha Go)


が挙げられます。学習内容の表現が教師あり学習より難しいため、ビジネス活用は上の2つよりは遅れています。

機械学習の歴史

機械学習の歴史は深く、始めて人工知能という言葉が使われたのが1956年のダートマス会議においてでした。世界初の汎用電子式コンピュータが開発されたちょうど10年後です。

人工知能はブームと冬の時代を何度も繰り返しています。

第1次AIブーム(1950年代後半〜1960年代)

コンピュータによる推論・探索の研究が進み、特定の問題に対して解を導けるようになったことが始まりです。東西冷戦中のアメリカでは英語ーロシア語の機械翻訳が注目されました。 しかし、数学の証明のような簡単な問題は解けても、現実の複雑な問題は解けないことが明らかになり、1970年代には冬の時代に入りました。

第2次AIブーム(1980年代)

コンピュータに知識を入れると賢くなるというアプローチが全盛となり、データベースに大量の専門知識を入れたエキスパートシステムが多数登場しました。しかし、その知識を管理・蓄積させることの大変さから1995年頃にまた冬の時代に突入しました。

第3次AIブーム(2010年〜)

ビッグデータを用いることで、人工知能が自ら知識を獲得する機械学習が実用化されました。また、特徴量(学習の際に注目すべき特徴を定量的に表したもの)を自ら発見して学習する深層学習(ディープラーニング)が登場したこともブームの背景です。

3つのブームは関係しあっています。
例えば、1990年にインターネット上にWebページが出現し、データが蓄積されるようになったことで、データ活用が進み、機械学習が発展しました。その機械学習も急に出現したわけではなく、第1次ブームや第2次ブームの時も機械学習は研究されています。

解決したい課題別 機械学習の活用事例

ここからは具体的に機械学習で解決できることを紹介していきます。よく聞く課題をピックアップしています。
(タイトルのリンククリックで事例ページに遷移します。)

コスト削減

点検作業の自動化
カメラで撮影した建物画像からひび割れ等の老朽化箇所を検出します。人からシステムに役割を変えることができ、人件費削減だけではなくかかる時間も短縮することができています。

倉庫内配置の最適化
倉庫内にカメラを配置し、撮影することで作業社の行動や物の位置を把握し分析します。倉庫内の動線や配置の最適化によって業務を効率化し、コスト削減を実現します。

特定箇所への農薬散布
企業が農業へ参入したことで、日本では集約農業から大規模農業へと転換が進んでいます。広大な農地で作物を育成する際に、ドローン等で空撮したデータから必要な箇所を割り出して、病害虫が発生している箇所ピンポイントに農薬を散布します。農薬使用量を削減できるだけでなく、他作物へのダメージを減らすことができます。

無人レジ
人がレジ打ちをする作業をなくしシステムが自動計算します。パンやドーナツ、ケーキなどラベルが付いていないものへのアプローチとして有効です。

人依存の解消

受注量予測
過去の受注量のメカニズムからどれだけの発注があるか予測します。ベテランにしかできなかった発注業務の敷居を下げることで、限られた人しかできなかった業務を分配することができます。

野菜収穫の自動化
ノウハウが重要な収穫時の見極めをAIがおこないます。AIが判断した後にロボットに信号を送ると自動で収穫をおこなうマシンも検討できます。

生産性向上

問合せへの自動応答
社内からの問合せ件数は日にかなりものです。その問合せをチャットボットで自動応答にすることができます。質問者も作文に時間をかけずに気軽に質問することができます。

居眠り検知
同じ作業が続く検品等で、うとうとしそうになってしまうことがあります。目の開きがあまくなるとアラートが鳴り、目を覚ましてくれるシステムも構築できます。

品質向上

高解像度画像の作成
最新のAI技術では荒く見づらい画像を高解像度に直すことができます。品質で失注していた案件に、より良い提案が出来る可能性が上がります。

コンベア内の品質チェック
コンベアを流れる物体が良品か不良品かを判定します。不良品可能性のある物は人が見るまでもなく振り分けることで、人の疲労による見落としを減らすことができます。

口コミ分析
集まった口コミを分析し、改善点を明確にします。その口コミが「ポジティブかネガティブか」を分類し、ネガティブな口コミの原因抽出をします。

導入検討フロー

導入検討が成功した事例はまだまだ公開数が少なく、何から手を付けてよいか...。と相談を受けることもあります。(もちろん例外も多々ありますが)一般的な機械学習導入検討フローを紹介します。


picture_pc_8a78dc2140d079f15eac054a9fdf3eba.png


1.企画

機械学習は手段であり、活用が目的ではありません。「解決すべき課題はなにか」を深堀りし、実現したい世界を明確にすることが大切です。手段として機械学習が適切かどうか、費用対効果の試算も必要です。 また、機械学習活用にはデータが必要です。必要なデータが揃っているのか、収集できるのか、どれほど欠損があるのか(すぐに機械学習に使えるキレイなデータはほとんどありません。)の確認もこの段階で重要です。

2.検証(PoC)

企画した計画の実現可能性を確かめる段階です。 機械学習アルゴリズムの選定→データの前処理(整形)→機械学習モデルの選定・構築→評価 のプロセスを実行し、求める結果に達する可能性と工数を確かめます。 求めたい精度に達するまで、別のアルゴリズムを試したり、モデルを変更したりとチューニングします。 機械学習は魔法ではありません。特性上、試してみないとどのくらいの精度が出せるか分かりません。そのため、まずは小さく試して実現可能性を確認することが必要です。

3.本開発

検証段階で実現性が確認できたモデルを実運用に向けて拡大していきます。 検証段階では限られた条件のため、作成したモデルをそのまま横展開しても思うような結果(精度)が出ないことも多々あります。その場合は、検証段階のモデルやノウハウを活用しつつも、モデルを再チューニングします。 また、目的に立ち返り、「本当に必要な精度」を再検討することで、チューニングにかかるコストを削減することもできます。

4.運用

いよいよ業務で活用します。機械学習を業務に取り入れると、業務フローが少なからず変わります。現場で使われるシステムにするために業務フローを再設計することが必要です。

機械学習はこれからビシネス活用が進んでいくフェーズです。そのため経験豊富なベンダーと二人三脚の検討が成功のコツでしょう。

アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める


会社概要はこちら


Twitter・Facebookで定期的に情報発信しています!

ディープラーニングを使って、人の顔の画像を入力すると 年齢・性別・人種 を判別するモデルを作ります。
身近な機械学習では1つのデータ(画像)に対して1つの予測を出力するタスクが一般的ですが、今回は1つのデータ(画像)で複数の予測(年齢・性別・人種)を予測します。


実装方法

学習用データ

まず、学習用に大量の顔画像が必要になりますが、ありがたいことに既に公開されているデータセットがあります。 UTKFace というもので、20万枚の顔画像が含まれています。また、年齢(0-116歳)、人種(白人、黒人、 アジア系、インド系、その他)、性別はもちろんですが、表情や画像の明るさ・解像度も多種多様なものがそろっています。
utkface.png

モデル

次に予測モデルについてですが、Efficient Net という2019/5月に Googleが発表したモデルを使います。このモデルは従来よりかなり少ないパラメータ数ながら、高い精度を誇る優れたモデルです。Kaggleのようなコンテストでも既に多用されていて、上位の人たちの多くが使っています。(参考:このコンテストでは上位陣の多くがEfficient Netを取り入れていました 詳しくは元論文や、その解説記事を参考にしてください。

efficientnet.png

加えて、今回のタスクは1つの入力(顔画像)から3つの出力(年齢・性別・人種)を返す、いわゆる複数出力型(Multi Output)にする必要があることにも注意します。


実装例

プログラミング環境 いくらEfficient Netの計算コストが小さいとはいっても、学習データの数も多く普通のCPUでは時間がかかりすぎてしまいます。専用GPU付PCがあればそれで良いのですが、私はないのでGoogle Colaboratoryのような外部のGPUを使う必要があります。実はKaggleにもGPU提供の機能があり、しかもKaggleの場合、あらかじめデータセットがNotebookに読み込まれている場合があります。つまり、配布元のサイトからデータをダウンロードしてくる必要がありません。今回使うUTKFaceも既に用意されているので、ありがたくこれを使っていきます。

まず、ここに行き、右にあるNew Notebookをクリックします。

how1.png

今回はPythonで実装するので、そのまま createを選択します。しばらくするとデータが読み込まれた状態のNotebookが使えるようになります。これで環境構築は完了です。

この時、図のように、【Settings】の項目のうち、 Internet を On に、Accelerator を GPU に設定 しておきましょう。

how2.png


コード全文

それではいよいよ実装していきます。ここでは、最初にコード全文を載せ、後で詳細に解説していきたいと思います。

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# Any results you write to the current directory are saved as output.


###### EfficientNetをインストール
! pip install -U efficientnet


###### 必要なライブラリを読み込む
import glob
import matplotlib.pyplot as plt
import seaborn as sns
from PIL import Image

from efficientnet.keras import EfficientNetB4  # Bの後の数字を変えれば別のスケールのモデルを使える
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical

from keras.layers import Input, Dense
from keras.models import Model
from keras.callbacks import ModelCheckpoint


###### 定数を定義
DATA_DIR = '../input/utkface-new/UTKFace'
IM_WIDTH = IM_HEIGHT = 198
TRAIN_TEST_SPLIT = 0.01  # 全体の8割を訓練データ、残り2割をテストデータにする
TRAIN_VALID_SPLIT = 0.7  # 訓練データのうち3割はバリデーションデータとして使う
ID_GENDER_MAP = {0: 'male', 1: 'female'}  # IDから性別へ変換するマップ
GENDER_ID_MAP = dict((g, i) for i, g in ID_GENDER_MAP.items())  # IDと性別の逆引き辞書
ID_RACE_MAP = {0: 'white', 1: 'black', 2: 'asian', 3: 'indian', 4: 'others'}  # IDから人種へ変換するマップ
RACE_ID_MAP = dict((r, i) for i, r in ID_RACE_MAP.items())  # IDと人種の逆引き辞書


###### ファイル名から正解ラベルを取り出す関数
def parse_filepath(filepath):
    # 年齢(int)、性別(str)、人種(str) を返す
    try:
        path, filename = os.path.split(filepath)  # 相対パスからファイル名を取り出す
        filename, ext = os.path.splitext(filename)  # 拡張子を除く
        age, gender, race, _ = filename.split("_")  # _は無名変数
        return int(age), ID_GENDER_MAP[int(gender)], ID_RACE_MAP[int(race)]

    except Exception as e:  # いくつか欠損値があるので例外処理をしておく
        print(filepath)
        return None, None, None


###### 年齢、性別、人種、ファイル名からなるDataFrameを作成
files = glob.glob(os.path.join(DATA_DIR, "*.jpg"))  # 全ての画像ファイル名をfilesという変数にまとめる
attributes = list(map(parse_filepath, files))  # 上で作成した関数にファイル名を一つずつ入力

df = pd.DataFrame(attributes)
df['file'] = files
df.columns = ['age', 'gender', 'race', 'file']
df = df.dropna()  # 欠損値は3つ
df['gender_id'] = df['gender'].map(lambda gender: GENDER_ID_MAP[gender])
df['race_id'] = df['race'].map(lambda race: RACE_ID_MAP[race])

# 10歳以下、65歳以上の人の画像は比較的少ないので使わないことにする
df = df[(df['age'] > 10) & (df['age'] < 65)]
# その中での最高年齢
max_age = df['age'].max()

###### train, test, validationデータの分割
p = np.random.permutation(len(df))  # 並び替え
train_up_to = int(len(df) * TRAIN_TEST_SPLIT)
train_idx = p[:train_up_to]
test_idx = p[train_up_to:]

# split train_idx further into training and validation set
train_up_to = int(train_up_to * TRAIN_VALID_SPLIT)
train_idx, valid_idx = train_idx[:train_up_to], train_idx[train_up_to:]


###### データの前処理を行う関数
def get_data_generator(df, indices, for_training, batch_size=32):
    # 処理した画像、年齢、人種、性別をbatch_sizeずつ返す

    images, ages, races, genders = [], [], [], []
    while True:
        for i in indices:
            r = df.iloc[i]
            file, age, race, gender = r['file'], r['age'], r['race_id'], r['gender_id']
            im = Image.open(file)
            im = im.resize((IM_WIDTH, IM_HEIGHT))
            im = np.array(im) / 255.0  # 規格化
            images.append(im)
            ages.append(age / max_age)  # 最大年齢で規格化
            races.append(to_categorical(race, len(RACE_ID_MAP)))  # kerasの仕様に合わせ、one-hot表現に
            genders.append(to_categorical(gender, 2))  # kerasの仕様に合わせ、one-hot表現に
            if len(images) >= batch_size:  # メモリを考慮して少しずつ結果を返す
                yield np.array(images), [np.array(ages), np.array(races), np.array(genders)]
                images, ages, races, genders = [], [], [], []
        if not for_training:
            break


###### モデルの作成
input_layer = Input(shape=(IM_HEIGHT, IM_WIDTH, 3))  # 最初の層

efficient_net = EfficientNetB4(
    weights='noisy-student',  # imagenetでもよい 
    include_top=False,  # 全結合層は自分で作成するので要らない
    input_tensor = input_layer,  # 入力
    pooling='max')

for layer in efficient_net.layers:  # 転移学習はしない
    layer.trainable = True

# 複数出力にする必要があるので、efficientnetの最終層から全結合層3つを枝分かれさせる
bottleneck=efficient_net.output 

# 年齢の予測
_ = Dense(units=128, activation='relu')(bottleneck)
age_output = Dense(units=1, activation='sigmoid', name='age_output')(_)

# 人種の予測
_ = Dense(units=128, activation='relu')(bottleneck)
race_output = Dense(units=len(RACE_ID_MAP), activation='softmax', name='race_output')(_)

# 性別の予測
_ = Dense(units=128, activation='relu')(bottleneck)
gender_output = Dense(units=len(GENDER_ID_MAP), activation='softmax', name='gender_output')(_)

# efficientnetと全結合層を結合する
model = Model(inputs=input_layer, outputs=[age_output, race_output, gender_output])

# 最適化手法・損失関数・評価関数を定義してコンパイル
model.compile(optimizer='rmsprop', 
              loss={'age_output': 'mse', 'race_output': 'categorical_crossentropy', 'gender_output': 'categorical_crossentropy'},
              loss_weights={'age_output': 2., 'race_output': 1.5, 'gender_output': 1.},
              metrics={'age_output': 'mae', 'race_output': 'accuracy', 'gender_output': 'accuracy'})

# バッチサイズを定義
batch_size = 32
valid_batch_size = 32

train_gen = get_data_generator(df, train_idx, for_training=True, batch_size=batch_size)
valid_gen = get_data_generator(df, valid_idx, for_training=True, batch_size=valid_batch_size)

# 検証誤差が最も低い状態のモデルを保存しておく
callbacks = [
    ModelCheckpoint('./model_checkpoint', monitor='val_loss', verbose=1, save_best_only=True, mode='min')
]

history = model.fit_generator(train_gen,
                    steps_per_epoch=len(train_idx)//batch_size,
                    epochs=10,
                    callbacks=callbacks,
                    validation_data=valid_gen,
                    validation_steps=len(valid_idx)//valid_batch_size)


###### 損失関数、評価関数の値をプロットする関数
def  plot_train_history(history):
    fig, axes = plt.subplots(1, 4, figsize=(20, 5))
    axes[0].plot(history.history['race_output_accuracy'], label='Race Train accuracy')
    axes[0].plot(history.history['val_race_output_accuracy'], label='Race Val accuracy')
    axes[0].set_xlabel('Epochs')
    axes[0].legend()

    axes[1].plot(history.history['gender_output_accuracy'], label='Gender Train accuracy')
    axes[1].plot(history.history['val_gender_output_accuracy'], label='Gener Val accuracy')
    axes[1].set_xlabel('Epochs')
    axes[1].legend()

    axes[2].plot(history.history['age_output_mae'], label='Age Train MAE')
    axes[2].plot(history.history['val_age_output_mae'], label='Age Val MAE')
    axes[2].set_xlabel('Epochs')
    axes[2].legend()  

    axes[3].plot(history.history['loss'], label='Training loss')
    axes[3].plot(history.history['val_loss'], label='Validation loss')
    axes[3].set_xlabel('Epochs')
    axes[3].legend()

plot_train_history(history)


test_gen = get_data_generator(df, test_idx, for_training=False, batch_size=128)
dict(zip(model.metrics_names, model.evaluate_generator(test_gen, steps=len(test_idx)//128)))

test_gen = get_data_generator(df, test_idx, for_training=False, batch_size=128)
x_test, (age_true, race_true, gender_true)= next(test_gen)
age_pred, race_pred, gender_pred = model.predict_on_batch(x_test)

race_true, gender_true = race_true.argmax(axis=-1), gender_true.argmax(axis=-1)
race_pred, gender_pred = race_pred.argmax(axis=-1), gender_pred.argmax(axis=-1)
age_true = age_true * max_age
age_pred = age_pred * max_age

from sklearn.metrics import classification_report
print("Classification report for race")
print(classification_report(race_true, race_pred))

print("\nClassification report for gender")
print(classification_report(gender_true, gender_pred))

import math
n = 30
random_indices = np.random.permutation(n)
n_cols = 5
n_rows = math.ceil(n / n_cols)
fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 20))
for i, img_idx in enumerate(random_indices):
    ax = axes.flat[i]
    ax.imshow(x_test[img_idx])
    ax.set_title('a:{}, g:{}, r:{}'.format(int(age_pred[img_idx]), ID_GENDER_MAP[gender_pred[img_idx]], ID_RACE_MAP[race_pred[img_idx]]))
    ax.set_xlabel('a:{}, g:{}, r:{}'.format(int(age_true[img_idx]), ID_GENDER_MAP[gender_true[img_idx]], ID_RACE_MAP[race_true[img_idx]]))
    ax.set_xticks([])
    ax.set_yticks([])


###### 最後にモデルを保存する
model.save('my_model.h5')

以上がデータ整形から、モデル構築、学習、予測までの一連のプログラムです。 ただ上記のコードは、データの可視化や、データの分布の分析といった試行錯誤の過程を含めていません。 以降ではこれらも含めて解説していきます。

コード解説

最初から行きましょう。

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to load in 

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the "../input/" directory.
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# Any results you write to the current directory are saved as output.

この部分は Kaggle のNotebookの最初に必ず書いてあるコードで、単純に numpy, pandas を読み込んだ後、input ディレクトリ内にある、データファイルをすべて書き出すという処理です。

続いて、efficientnet をインストールしてライブラリを読み込みます。

###### 定数を定義
DATA_DIR = '../input/utkface-new/UTKFace'
IM_WIDTH = IM_HEIGHT = 198
TRAIN_TEST_SPLIT = 0.8  # 全体の8割を訓練データ、残り2割をテストデータにする
TRAIN_VALID_SPLIT = 0.7  # 訓練データのうち3割はバリデーションデータとして使う
ID_GENDER_MAP = {0: 'male', 1: 'female'}  # IDから性別へ変換するマップ
GENDER_ID_MAP = dict((g, i) for i, g in ID_GENDER_MAP.items())  # IDと性別の逆引き辞書
ID_RACE_MAP = {0: 'white', 1: 'black', 2: 'asian', 3: 'indian', 4: 'others'}  # IDから人種へ変換するマップ
RACE_ID_MAP = dict((r, i) for i, r in ID_RACE_MAP.items())  # IDと人種の逆引き辞書

ここでは各種定数を定義しています。DATADIR は画像ファイルが入っているディレクトリを指定します。画像は後で前処理をして、IMWIDTH, IM_HEIGHT のサイズにします。 この値は本来注意深く選ぶべきです(EfficientNetの強みが生きるパラメータです)が、今回はとりあえず予測まで実装することが先決なので、適当(テキトー)な値に設定してしまいます。 精度を上げたい場合には見直さなければいけないでしょう。

###### ファイル名から正解ラベルを取り出す関数
def parse_filepath(filepath):
    # 年齢(int)、性別(str)、人種(str) を返す
    try:
        path, filename = os.path.split(filepath)  # 相対パスからファイル名を取り出す
        filename, ext = os.path.splitext(filename)  # 拡張子を除く
        age, gender, race, _ = filename.split("_")  # _は無名変数
        return int(age), ID_GENDER_MAP[int(gender)], ID_RACE_MAP[int(race)]

    except Exception as e:  # いくつか欠損値があるので例外処理をしておく
        print(filepath)
        return None, None, None

データの配布元のwebページを見ればわかるのですが、それぞれの画像ファイルの名前は、 [age][gender][race]_[date&time].jpg となっており、[age] はそのまま 0 ~ 116 までの整数、[gender] は 0 (男性) か 1 (女性)、[race] は 0 (白人) か 1 (黒人) か 2 (アジア系) か 3 (インド系) か 4 (その他--ヒスパニックやラテン系等) となっています。 従って画像ファイル名から、その画像に映っている人の情報を取り出す処理が必要で、それをしているのが上記の部分です。

###### 年齢、性別、人種、ファイル名からなるDataFrameを作成
files = glob.glob(os.path.join(DATA_DIR, "*.jpg"))  # 全ての画像ファイル名をfilesという変数にまとめる
attributes = list(map(parse_filepath, files))  # 上で作成した関数にファイル名を一つずつ入力

df = pd.DataFrame(attributes)
df['file'] = files
df.columns = ['age', 'gender', 'race', 'file']
df = df.dropna()  # 欠損値は3つ
df['gender_id'] = df['gender'].map(lambda gender: GENDER_ID_MAP[gender])
df['race_id'] = df['race'].map(lambda race: RACE_ID_MAP[race])

ここでは取り出した正解ラベルから、分析しやすいようにDataFrame を作成しています。 欠損値については

df.isnull().sum()

で調べることができ、結果は3でした。全体2万枚のうちで欠損値は3枚だけなので今回は考慮しません。

ここで、年齢について考えてみると、高齢者の写真は他の年代に比べて少ないのではないかと推測されます。もしそうであれば学習させるデータに偏りが生じることになり、予測精度が落ちてしまうでしょう。 画像の枚数が各年代で均一になるように画像の水増しをしても良いですが、ここでは簡単のためそういったマイナーな分は捨象することにします。

まず、次のようにして性別・人種ごとの年齢分布を調べます。

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
_ = sns.boxplot(data=df, x='gender', y='age', ax=ax1)
_ = sns.boxplot(data=df, x='race', y='age', ax=ax2)

how04.png

すると、図のような結果になり、多くが10歳から60歳くらいであるとわかります。

年齢だけの分布を見るには

fig = plt.figure()
ax = fig.add_subplot(111)

ax.hist(df['age'], bins=50)
fig.show()

とすればよく、次のグラフが得られます。

how4.png

以上の分析をもとに、10歳以上65歳以下だけ考えることにします(ちゃんと精度を上げたいなら、データの水増しの方が有効でしょう)。それが次の部分です。

# 10歳以下、65歳以上の人の画像は比較的少ないので使わないことにする
df = df[(df['age'] > 10) & (df['age'] < 65)]

次に行きます。

###### train, test, validationデータの分割
p = np.random.permutation(len(df))  # 並び替え
train_up_to = int(len(df) * TRAIN_TEST_SPLIT)
train_idx = p[:train_up_to]
test_idx = p[train_up_to:]

# split train_idx further into training and validation set
train_up_to = int(train_up_to * TRAIN_VALID_SPLIT)
train_idx, valid_idx = train_idx[:train_up_to], train_idx[train_up_to:]

この部分は実際に traintestsplit のように分割を行っているわけではなく、index を振りなおしているだけです。

###### データの前処理を行う関数
def get_data_generator(df, indices, for_training, batch_size=32):
    # 処理した画像、年齢、人種、性別をbatch_sizeずつ返す

    images, ages, races, genders = [], [], [], []
    while True:
        for i in indices:
            r = df.iloc[i]
            file, age, race, gender = r['file'], r['age'], r['race_id'], r['gender_id']
            im = Image.open(file)
            im = im.resize((IM_WIDTH, IM_HEIGHT))
            im = np.array(im) / 255.0  # 規格化
            images.append(im)
            ages.append(age / max_age)  # 最大年齢で規格化
            races.append(to_categorical(race, len(RACE_ID_MAP)))  # kerasの仕様に合わせ、one-hot表現に
            genders.append(to_categorical(gender, 2))  # kerasの仕様に合わせ、one-hot表現に
            if len(images) >= batch_size:  # メモリを考慮して少しずつ結果を返す
                yield np.array(images), [np.array(ages), np.array(races), np.array(genders)]
                images, ages, races, genders = [], [], [], []
        if not for_training:
            break

このこの部分はデータの前処理を行っています。前処理といっても大したことはしておらず、やっていることは、規格化とラベルの表現をone-hotに直すことだけです。 yield を使っているのは、メモリの上限が割と厳しいので、少しずつ渡さないとパンクしてしまうからです。

また、while True: の無限ループは学習実行時は epochs=10 のように同じ処理を繰り返す必要があるため、学習実行時のみ必要です。

続いて、いよいよモデルを構築していきます。 最終的に作りたいモデルは以下の図です。

how5.png

下の枝分かれしている部分(全結合層)は自分で作成し、上の畳み込み部分( EfficientNet )と結合させます。 Kerasには大きく二つの書き方があり、Sequentialモデルと、Functional API と呼ばれています。 Sequentialモデルの方は、

model = Sequential()
model.add(Dense(64, input_dim=100))
model.add(Activation('relu'))

のように、.add()メソッドを使って層を積み重ねていくようにモデルを構築できるので直感的でわかりやすい反面、柔軟性にやや劣り、複数入出力や分岐などを含む、複雑なモデルを構築するのには向いていません。

もうひとつのFunctional API は

inputs = Input(shape=(784,))
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

のような書き方で、層一枚一枚の入出力を指定できる分、自由度の高いモデル構築が可能です。

今回作るものは、分岐が一か所入るだけの、比較的単純なものなのでどちらの書き方でも可能です。コードではFunctional APIで記述しています。

###### モデルの作成
input_layer = Input(shape=(IM_HEIGHT, IM_WIDTH, 3))  # 最初の層

efficient_net = EfficientNetB4(
    weights='noisy-student',  # imagenetでもよい 
    include_top=False,  # 全結合層は自分で作成するので要らない
    input_tensor = input_layer,  # 入力
    pooling='max')

for layer in efficient_net.layers:  # 転移学習はしない
    layer.trainable = True

efficient_net の引数について説明します。 weights は初期状態でのネットワークのパラメータのことです。これはランダムでもよいですが、imagenet という画像データ群で学習させた値を使ったり、noisy-studentという学習法で学習させた値を使ったほうが、一般的に計算時間は短くなります。

include_top は畳み込み層だけでなく、全結合層もefficientnetの物を使うかどうかを決める引数です。今回は分岐という特殊な場合なので自分で作成する必要があります。

また、layer.trainable は転移学習するかどうかを決めます。した方がずっと計算時間は短くなりますが、試したところ精度が悪かったので、今回はすべてのパラメータを学習させます。

# 複数出力にする必要があるので、efficientnetの最終層から全結合層3つを枝分かれさせる
bottleneck=efficient_net.output 

# 年齢の予測
_ = Dense(units=128, activation='relu')(bottleneck)
age_output = Dense(units=1, activation='sigmoid', name='age_output')(_)

# 人種の予測
_ = Dense(units=128, activation='relu')(bottleneck)
race_output = Dense(units=len(RACE_ID_MAP), activation='softmax', name='race_output')(_)

# 性別の予測
_ = Dense(units=128, activation='relu')(bottleneck)
gender_output = Dense(units=len(GENDER_ID_MAP), activation='softmax', name='gender_output')(_)

# efficientnetと全結合層を結合する
model = Model(inputs=input_layer, outputs=[age_output, race_output, gender_output])
この部分は functional API の書き方で全結合層を作成し、efficientnetと結合させています。

注意すべきは次の部分です。

# 最適化手法・損失関数・評価関数を定義してコンパイル
model.compile(optimizer='rmsprop', 
              loss={'age_output': 'mse', 'race_output': 'categorical_crossentropy', 'gender_output': 'categorical_crossentropy'},
              loss_weights={'age_output': 2., 'race_output': 1.5, 'gender_output': 1.},
              metrics={'age_output': 'mae', 'race_output': 'accuracy', 'gender_output': 'accuracy'})

全結合層が3つある分、損失関数や評価関数も3つずつ定義する必要があります。 年齢の予測は回帰問題なので、平均二乗誤差、性別と人種は分類問題なので categorical cross-entropy を損失関数に使えばよいでしょう。

続く部分はバッチサイズを定義し、データを作成しています。 バッチサイズを大きくすると収束性が良くなりますが、やりすぎるとメモリがパンクするので注意しましょう。 batch_size = 64 だとうまくいかないと思います。

次です。

# 検証誤差が最も低い状態のモデルを保存しておく
callbacks = [
    ModelCheckpoint('./model_checkpoint', monitor='val_loss', verbose=1, save_best_only=True, mode='min')
]

callbacks という便利な機能を使います。これは validation data の損失関数を監視し、それが最小であったepochでのモデルを保存しておいてくれる機能です。 これにより過学習を防ぐことができます。

そして次の部分で学習を実行します。

history = model.fit_generator(train_gen,
                    steps_per_epoch=len(train_idx)//batch_size,
                    epochs=10,
                    callbacks=callbacks,
                    validation_data=valid_gen,
                    validation_steps=len(valid_idx)//valid_batch_size)

私の場合は40分ほどかかりました。気長に待ちましょう。

学習が済んだら損失関数と評価関数の値をグラフに表して学習がうまくいったかどうか確認します。

def  plot_train_history(history):
    fig, axes = plt.subplots(1, 4, figsize=(20, 5))
    axes[0].plot(history.history['race_output_accuracy'], label='Race Train accuracy')
    axes[0].plot(history.history['val_race_output_accuracy'], label='Race Val accuracy')
    axes[0].set_xlabel('Epochs')
    axes[0].legend()

    axes[1].plot(history.history['gender_output_accuracy'], label='Gender Train accuracy')
    axes[1].plot(history.history['val_gender_output_accuracy'], label='Gener Val accuracy')
    axes[1].set_xlabel('Epochs')
    axes[1].legend()

    axes[2].plot(history.history['age_output_mae'], label='Age Train MAE')
    axes[2].plot(history.history['val_age_output_mae'], label='Age Val MAE')
    axes[2].set_xlabel('Epochs')
    axes[2].legend()  

    axes[3].plot(history.history['loss'], label='Training loss')
    axes[3].plot(history.history['val_loss'], label='Validation loss')
    axes[3].set_xlabel('Epochs')
    axes[3].legend()

plot_train_history(history)

loss1.png

epoch2.png

epoch 8 で何やら起こっていますが他の部分でも変動が激しいことからも確率的に起こりうることなのかもしれません。 また、特に性別と人種の分類において、かなり過学習が起こっていることが見て取れます。

最後に、各種精度に関係する値を出力し、テストデータについても予測します。

test_gen = get_data_generator(df, test_idx, for_training=False, batch_size=128)
dict(zip(model.metrics_names, model.evaluate_generator(test_gen, steps=len(test_idx)//128)))

test_gen = get_data_generator(df, test_idx, for_training=False, batch_size=128)
x_test, (age_true, race_true, gender_true)= next(test_gen)
age_pred, race_pred, gender_pred = model.predict_on_batch(x_test)

race_true, gender_true = race_true.argmax(axis=-1), gender_true.argmax(axis=-1)
race_pred, gender_pred = race_pred.argmax(axis=-1), gender_pred.argmax(axis=-1)
age_true = age_true * max_age
age_pred = age_pred * max_age

from sklearn.metrics import classification_report
print("Classification report for race")
print(classification_report(race_true, race_pred))

print("\nClassification report for gender")
print(classification_report(gender_true, gender_pred))

import math
n = 30
random_indices = np.random.permutation(n)
n_cols = 5
n_rows = math.ceil(n / n_cols)
fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 20))
for i, img_idx in enumerate(random_indices):
    ax = axes.flat[i]
    ax.imshow(x_test[img_idx])
    ax.set_title('a:{}, g:{}, r:{}'.format(int(age_pred[img_idx]), ID_GENDER_MAP[gender_pred[img_idx]], ID_RACE_MAP[race_pred[img_idx]]))
    ax.set_xlabel('a:{}, g:{}, r:{}'.format(int(age_true[img_idx]), ID_GENDER_MAP[gender_true[img_idx]], ID_RACE_MAP[race_true[img_idx]]))
    ax.set_xticks([])
    ax.set_yticks([])

err1.png

err2.png

f1- score が大まかな指標になります。人種については80%の確率、性別については97%の確率で正解していることが分かります。また、学習時と比べると、過学習の傾向が強いこともうかがえます。 人種に関しては、ラベル4、すなわち 「その他の人種」についての予測が壊滅的にできていないことが分かります。

続いてテストデータのサンプルです。上が予測値、下が実際の値です。

face1.png face2.png

チューニングの余地がある割にはある程度予測できています。

何人か知っている人についても予測してみました。

sample1.png sample2.png

あれ.........

まとめ

今回は顔の画像から、年齢・性別・人種を同時に推定するモデルをEfficient Net を使って作りました。 今回の例のようなマルチタスク処理は、シングルタスクの精度を向上させる際にも使われることもあり、有用なので是非利用してほしいと思います。 ただ、本来EfficientNetは画像の解像度を畳み込み層の深さ・大きさと共に調節すべきものであり、今回の処理ではそれを省いているので制度は出にくい状態です。 また、画像認識の大変なところはパラメータを調節して精度を上げていくところにこそあるので、次回はこのモデルをチューニングし、過学習を抑えたりしてより精度を上げていこうと思います。

参考となるリンク先


Twitter・Facebookで定期的に情報発信しています!

サービスへのお客様の評価はその場では気付きにくく、特にネガティブなものは直接伝えてはくれません。

しかしお客様の声を知ることはより満足してもらうためには必須です。
今回は口コミサイトに投稿されたレビューを分析し、お客様の本当の声を知るためのサービスを紹介します。

0.サービス紹介_口コミ分析

Web上で集めた口コミ(レビュー)をAIが精査し、ネガティブな口コミはネガティブな原因を特定します。

数が少ないうちは手作業で評価の精査が出来ますが、数が多くなってくるとそういう訳にもいきません。
大量の口コミを一から全て見ていくとなると大量の人手、時間がかかります。

そのコスト削減に向けて口コミ文章をAIに評価させネガティブなものだけを選別し、改善のための時間を創出しましょう。

前回のブログでosetiというライブラリを用いて口コミをネガポジ分析しましたが、これには問題点がありました。

  1. 日本語評価極性辞書に載っていない単語が出現した際、それらを定量的に評価できない。
  2. 極性辞書の単語の評価には作成者の感情が入っているので、客観的な評価が完璧にできない。
  3. 1文ごとにネガポジ判定を行うので、文章全体で見たときに文脈を読み取れない。


特に3.について、1つの口コミ全体で見た時にそれがかなりポジティブなものであっても、トータルで見た時に「かなり」の部分をAIは読み取れませんでした。 また、全体的にポジティブなレビュー(=口コミ) でも、一部ネガティブな内容が含まれているケースもあります。

このような "ポジティブ寄りのレビュー" 中に含まれるネガティブな内容について、このように仮定しています。
ポジティブ寄りのレビューにもネガティブな内容を含んでいるものがあり、「自店のネガティブなイメージを発見したい」という目標を達成するためには、これらも発見しなければなりません。 そこで、図のような関係があると仮定し、今回はネガティブ寄りのレビューを発見していくことにします。

ブログbert1.png


1.口コミの抽出

ランダムに抽出した東京都内にあるラーメン店で、約800件のレビューをGoogle口コミから抽出しました。一部です。
ブログbert2.png

このように約800件のレビューを抽出し、ポジティブは「1」ネガティブは「0」とラベリングを行いました。


2.そもそもBERTとは?

ではBERTにこれらのデータを学習させ、評価をしていきましょう。BERTについて簡単に説明をします。

BERT

BERT ( Bidirectional Encoder Representations from Transformers )は2018年にGoogleが発表したNLPモデルであり、その翌年には検索エンジンにも導入されました。この導入に対しては「過去最大のアップデート」と呼ばれ、メディアにも大きく取り上げられました。

このBERTの特徴はなんといっても「(文章における) 文脈を理解できる 」ことでしょう。

BERTが発表される以前のNLPモデルでは、「魚介じゃないラーメン」と「魚介 ラーメン」がほぼ同じように認識されていました。 これまでのモデルは「魚介」「じゃない」「ラーメン」と個別に理解できることは可能でしたが、「じゃない」という単語が「魚介」にかかっていることを認識できずに、結果文章の中で意味が明確な「魚介」「ラーメン」の二語が強調されてしまうことが原因でした。

しかしこのBERTでは、「魚介じゃないラーメン」のうち、「じゃない」という単語が「魚介」にかかるという文法上の構造を理解することができるのです。 このようなBERTの処理能力の高さは、今回例にした「魚介じゃないラーメン」のような短いワード以上に、「銀座駅で10分以内に魚介じゃないラーメンを食べたい」などの文章となった場合に、より力を発揮すると推測されます。
Googleが導入したBERTとは?誰でもわかるBERTの特徴を解説より引用

このBERTについての詳しいアルゴリズムについては、本記事のレベルを逸脱するため割愛します。(7.参考文献を参照)


3.口コミ分析の実装

BERTについては、こちらのサイトにあるBERT日本語Pretrainedモデルを用い、コーディングはBERTを用いたネガポジ分類機の作成を参考に実装しました。

この日本語Pretrainedモデルは、日本語全てのWikipediaの文章約1,800万文のテキストから、32,000語の語彙を事前学習したモデルです。

未知語抽出によるデータの前処理

この事前学習済みモデルはWikipediaの文章から単語を学習しているため、「おいしかった」「不快だった」などの感情を表す客観的な言葉が未知語として認識されています。そのため、未知語を抽出しvocab2というBERT語録辞書に入っている意味の似た単語と未知語を交換します。
例えば、「めっちゃ」を「とても」に、「不快だった」を「悪かった」などといったように変換していきます。

import re
replaced_pos = []
replaced_neg = []

for i in range(len(pos)):
  replaced_pos.append(re.sub(r'おいしい', 'うまい', pos[i]))

for i in range(len(neg)):
  replaced_neg.append(re.sub(r'不味い', 'ひどい', neg[i]))

for i in range(len(neg)):
  replaced_neg[i] = re.sub(r'おいしい', 'うまい', replaced_neg[i])

for i in range(len(pos)):
  replaced_pos[i] = re.sub(r'らーめん', 'ラーメン', replaced_pos[i])

for i in range(len(neg)):
  replaced_neg[i] = re.sub(r'らーめん', 'ラーメン', replaced_neg[i])

. . .

レビューの評価に影響するであろう「味」「接客態度」「店内の雰囲気(衛生面など)」の3つに注目し変換しました。

サンプルの文章による推論とAttentionの可視化

レビューの評価にあたりAIが注目した箇所を色付けします。
前述したPretrainedモデルの utils/predict.py に学習済みモデルのビルド( buildbertmodel )と推論( predict )のメソッドを定義してあるので、 これらを利用してサンプルの文章をインプットし、予測値(Positive or Negative)とAttentionを可視化します。

from utils2.config import *
from utils2.predict import predict, create_vocab_text, build_bert_model
from IPython.display import HTML, display

input_text = "サンプルの文章を入力"
net_trained = build_bert_model()
html_output = predict(input_text, net_trained)
print("======================推論結果の表示======================")
print(input_text)
display(HTML(html_output))

結果は以下のようになります。(例としてPositiveとNegativeを1つずつ)

attention.png ブログbert3.png

ここで[UNK]は未知語を、[CLS]は文の開始を表しています。また、Attentionの重み値が大きいほど背景色が濃い赤で表示されています。Attentionによって、AIは判定に必要であろう単語に"注目"していることが分かります。
Attentionについては参考文献でも紹介しています。


4.結果及び考察

最後にテストデータで実際に判定をします。 今回は全てのデータを「訓練データ:テストデータ=7:3」に分け、ハイパーパラメータ(バッチサイズ、エポック)は適宜変更して学習させていきます。

バッチサイズを8、16、32としそれぞれエポックを1~100まで設定した結果は以下のようになりました。

  • 正解率 : 全サンプルのうち、正解したサンプルの割合
  • 適合率(精度) : positiveと予測された中で、実際にpositiveであった確率
  • 再現率 : 実際にpositiveであるデータに対して、positiveと予測された確率
  • F値 : 適合率と再現率の調和平均

バッチサイズ8(1).png バッチサイズ16(1).png バッチサイズ32(1).png

全体として適合率は90%前後と高い結果です。かなりの高精度でネガティブなレビューを抽出できています。(ネガティブが抽出できるということはポジティブも自ずと抽出できています。)

バッチサイズが8の時は再現率に波があり、エポック数を増やしても再現率が40%を下回るときがありました。そこでバッチサイズを16に変更したところ、エポック数の増加に伴い再現率もかなり向上しました。 次にバッチサイズを32として学習を進めると、エポック数45までは再現率70%前後でその後急低下、再び上昇し最終的には90%近くまで上がるという興味深い結果が得られました。 一見するとバッチサイズ16の時が一番学習が上手くいくように見えますが、3つのバッチサイズでは全体的に最終的なF値は90%前後で頭打ちとなる結果となりました。


参考までに訓練データに対する損失と正解率も見てみましょう。

  • trainloss : 訓練データの損失(学習の時点でほぼ0)
  • trainacc : 訓練データの正解率(学習の時点でほぼ1)
  • valloss : バリデーションデータの損失(低い方が良い)
  • valacc : バリデーションデータの正解率(高い方が良い)

バッチサイズ8(2).png バッチサイズ16(4).png バッチサイズ32(2).png

trainlossとtrainaccについては、訓練データで学習を行っているので自明の結果といって良いでしょう。 バリデーションデータの損失の山になっている(急上昇している)ところでは、それに対応して再現率は下がっていることが分かります。学習がうまく出来ていないということです。

5.【参考】口コミのグルーピング

今回の目的であったネガティブな口コミの選定は達成できることがわかりました。次にネガティブなレビューの原因を特定しましょう。
「clerk(店員の態度)」「shop(店内の雰囲気)」「taste(味)」「noodle(麺)」「soup(スープ)」「ingredients(具材)」の6つ(重複あり)に分けて棒グラフにします。

ネガ口コミ.png

それぞれが原因のレビューの数です。味はもちろん、店員の態度も重要な要因なことが分かります。

EmbeddingProjectorを用いた可視化

EmbeddingProjectorを用いて可視化します。
知りたいカテゴリーを絞り込んでレビューを確認できるので、改善点をより発見しやすくなり、口コミを活かした業務改善が効率よく行えるでしょう。

EmbeddingProjectorは口コミの文章をword2vecによってベクトル化し、その後PCAによる次元削減を行い2or3次元空間上にマッピングすることによって可視化できます。 今回は「店員」「味」の2つを3次元空間に落とし込んでみます。まずはデータをロードし、下の画面右側のSearchのところで「店員」と検索します。

clerk3.png

「店員」と含まれている口コミが計88件あり、3次元空間上にきちんとマッピングできています。 その中で基準となる口コミを一つ選択し、下の画面右側のneighbor(近傍)を10などと設定すると、基準となる口コミから距離の近い(意味の近い)口コミが10個マーキングされます。

clerk.png

同じように「味」についてもみていきましょう。

taste.png

棒グラフでみた店員と味に絞って「何が悪いか」を更に深堀りしました。


6.総評

今回はBERTを用いて口コミ分析をしました。

前回の「単語」のみに着目した評価では、辞書に載っていない単語の評価が出来なかったり、文章全体の文脈を理解出来ていないという問題点がありましたが、BERTを用いることで、人間に近い判断基準をモデルに学習させることが出来、大幅に精度が向上しました。 口コミの中でネガティブな評価を選定し、グルーピングをすることで今まで発見できていなかった課題点も見つけやすくなります。

最後に、これから更に改善できる点です。

  • BERTのpretrainedモデルは日本語のwikipediaを対象に事前学習していたため、口コミ特有のワードへの対応が不十分であった
  • データの前処理の方法はさらに検討できる
  • 対象となるターゲットを広げたときに口コミの文章や書き方にバラツキがでるため、良い精度を出すためにさらに検討が必要


これらの課題を解決するにはSNSの事前学習モデルを使ったり、様々な工夫を考えて分類器を作成することが重要となってくるでしょう。 BERTでもかなりの精度を出せると思いますが、他の新しいNLPモデルも次々と発表されているので、これらを用いてまだ企業が利活用出来ていない口コミやSNSの書き込みなどを分析することで、顧客満足度向上に繋げられると思います。


7.参考文献

BERTとは何か?Googleが誇る最先端技術の仕組みを解説!
【論文】"Attention is all you need"の解説
BERTを用いたネガポジ分類機の作成
BERTを理解しながら自分のツイートを可視化してみるハンズオン


Twitter・Facebookで定期的に情報発信しています!

はじめに

このブログは前回、ドーナツの無人レジ化に向け機械学習をどのように用いるかを紹介しました。今回は、その中で出てきたドーナツ検出器の中身について紹介します。


目次

  • はじめに
  • 検出器を作るために必要なもの
  • どのような流れで作るか
  • 実際に作る
  • まとめ


必要なもの

ドーナツ検出器を作るために、ドーナツの画像データを訓練とテストを用意します。
今回は、「6種類のドーナツを検出し、合計金額を出す」ことが目標として、6種類のドーナツそれぞれの写真を50枚ずつ撮影しました。また、ドーナツが裏返っていても判断できるよう、裏返ったドーナツも同様に撮影しています(訓練データ)。テストデータは複数のドーナツが写る写真を撮りました。このドーナツの中には裏返ったものや写真からきれてしまっているドーナツも含んでいます。

スクリーンショット 2020-03-12 16.04.54.png


作成手順

ドーナツ検出器をどのような流れで作るかを紹介します。物体検出のためにYOLO3を用います。

 大まかな流れとして、このような作業をしています。

  1. 学習用の画像を整える、画像の水増し
  2. YOLO3でテスト用データのドーナツ一つ一つを検出する
  3. 学習モデルを用いてドーナツ名を予測する
  4. 合計金額などを表示する


1.ではYOLO3を用いて学習用の画像データからドーナツの部分だけを検出します。検出後、画像のアスペクト比(縦横比)を変えずにリサイズをします。画像は一つのドーナツに対して50枚しかないので回転や反転を用いて画像を水増しましょう。一つのドーナツに対して1500枚まで水増ししました。
3.では2.で検出したドーナツ画像から学習モデルを作成します。VGG16を用いて作成しました。


実際に作る

訓練データからドーナツの部分だけ検出する

スクリーンショット 2020-03-12 17.19.50.png

必要なライブラリをインポートします。

import logging
logging.disable(logging.WARNING)
import os
import glob

import numpy as np
from keras import backend as K
from keras.layers import Input

from PIL import Image

from yolo import YOLO
from PIL import Image
from yolo3.utils import letterbox_image

from matplotlib import pyplot as plt

keras-yolo3のYOLOクラスを継承してdetect_imageメソッドを修正します。

class CustomYOLO(YOLO):
  _defaults = {
        "model_path": 'model_data/yolo.h5',
        "anchors_path": 'model_data/yolo_anchors.txt',
        "classes_path": 'model_data/coco_classes.txt',
        "model_image_size" : (640, 640),
        "gpu_num" : 1,
    }

  def __init__(self, score=0.3, iou=0.45):
    self.__dict__.update(self._defaults)
    self.score = score
    self.iou = iou
    self.class_names = self._get_class()
    self.anchors = self._get_anchors()
    self.sess = K.get_session()
    self.boxes, self.scores, self.classes = self.generate()

  def detect_image(self, image):
        if self.model_image_size != (None, None):
            assert self.model_image_size[0]%32 == 0, 'Multiples of 32 required'
            assert self.model_image_size[1]%32 == 0, 'Multiples of 32 required'
            boxed_image = letterbox_image(image, tuple(reversed(self.model_image_size)))
        else:
            new_image_size = (image.width - (image.width % 32),
                              image.height - (image.height % 32))
            boxed_image = letterbox_image(image, new_image_size)
        image_data = np.array(boxed_image, dtype='float32')

        image_data /= 255.
        image_data = np.expand_dims(image_data, 0)  # Add batch dimension.

        out_boxes, out_scores, out_classes = self.sess.run(
            [self.boxes, self.scores, self.classes],
            feed_dict={
                self.yolo_model.input: image_data,
                self.input_image_shape: [image.size[1], image.size[0]],
                K.learning_phase(): 0
            })

        donut_out_boxes = []

        for i, c in reversed(list(enumerate(out_classes))):
          if self.class_names[c] == 'donut':
            box = out_boxes[i]
            top, left, bottom, right = box
            top = max(0, np.floor(top + 0.5).astype('int32') - 100)
            left = max(0, np.floor(left + 0.5).astype('int32') - 100)
            bottom = min(image.size[1], np.floor(bottom + 0.5).astype('int32') + 100)
            right = min(image.size[0], np.floor(right + 0.5).astype('int32') + 100)
            donut_out_boxes.append([left, top, right, bottom])

        return donut_out_boxes

YOLOで訓練画像からドーナツ部分を切り取って画像を保存します。

def crop_donuts(front_or_back):
  for dir_name in label_dict.keys():
    print(dir_name)
    output_path = '../data/cropped_donut_images/' + front_or_back + '/' + dir_name

    if not os.path.exists(output_path):
      os.makedirs(output_path)

    for file_path in glob.glob('../data/donut_images/' + front_or_back + '/' + dir_name + '/*.jpg'):
      file_name = file_path[-12:-4] 
      image = Image.open(file_path)
      out_boxes = yolo.detect_image(image.copy())

      if len(out_boxes) == 1:
        cropped_img = image.crop(out_boxes[0])
        cropped_img.save(output_path + '/' + str(file_name) + '.jpg')

訓練画像内にはドーナツが1つしかないはずなので、2つ以上ドーナツを検出した場合は保存せずその画像はスキップします。保存した画像を確認し、検出したがうまく切り取れていない画像はフォルダから削除してください。

YOLOでの検出がうまくいかなかった画像、検出したが切り出しがうまくいかなかった画像を抽出します。

def copy_undetected_images(front_or_back):
  for dir_name in label_dict.keys():
    print(dir_name)
    output_path = '../data/not_detected_images/' + front_or_back + '/' + dir_name

    if not os.path.exists(output_path):
      os.makedirs(output_path)

    for file_path in glob.glob('../data/donut_images/' + front_or_back + '/' + dir_name + '/*.jpg'):
      file_name = file_path[-12:-4] 
      path = '../data/cropped_donut_images/' + front_or_back + '/' + dir_name + '/' + file_name + '.jpg'

      if not os.path.exists(path):
        image = Image.open(file_path)
        image.save(output_path + '/' + str(file_name) + '.jpg')

ここで、抽出されたものは、手動でドーナツ部分を切り取りました。

1つ前の関数で抽出した画像をcroppeddonutimagesフォルダ下の適切なフォルダにコピーします。

def copy_images_cropped_by_hands(front_or_back):
  for dir_name in label_dict.keys():
    print(dir_name)
    output_path = '../data/cropped_donut_images/' + front_or_back + '/' + dir_name

    if not os.path.exists(output_path):
      os.makedirs(output_path)

    for file_path in glob.glob('../data/images_cropped_by_hands/' + front_or_back + '/' + dir_name + '/*.jpg'):
      file_name = file_path[-12:-4] 
      path = output_path + '/' + file_name + '.jpg'

      if not os.path.exists(path):
        image = Image.open(file_path)
        image.save(path)

ドーナツの画像分類のモデル作成

スクリーンショット 2020-03-12 17.25.30.png

アスペクト比を変えずに設定した大きさに画像をリサイズします。

def resize(img, base_w, base_h):
  base_ratio = base_w / base_h
  img_h, img_w = img.shape[:2]
  img_ratio = img_w / img_h

  white_img = np.zeros((base_h, base_w, 3), np.uint8)
  white_img[:, :] = [220, 220, 220]

  if img_ratio > base_ratio:
    h = int(base_w / img_ratio)
    w = base_w
    resize_img = cv2.resize(img, (w, h))
  else:
    h = base_h
    w = int(base_h * img_ratio)
    resize_img = cv2.resize(img, (w, h))

  white_img[int(base_h/2-h/2):int(base_h/2+h/2),int(base_w/2-w/2):int(base_w/2+w/2)] = resize_img
  resize_img = white_img

  return resize_img

正解ラベルのエンコード用に辞書を定義します。

label_dict = {
    'エンゼルクリーム': 0,
    'エンゼルフレンチ': 1,
    'オールドファッションハニー': 2,
    'ダブルチョコレート': 3,
    'チョコファッション': 4,
    'ポンデリング': 5,
}

データセットを作成します。

front_path = './drive/My Drive/donuts_detection/data/cropped_donut_images/front/'
back_path = './drive/My Drive/donuts_detection/data/cropped_donut_images/back/'

IMG_SIZE = 256
X = []
y = []

print("== DONUTS FRONT ==")
for dir_name in label_dict.keys():
  print(dir_name)
  label = label_dict[str(dir_name)]

  X_tmp = []
  y_tmp = []

  for file_path in glob.glob(front_path + dir_name + '/*.jpg'):
    img = image.load_img(file_path)
    # img = rotate(img)
    img = image.img_to_array(img)
    img = resize(img, IMG_SIZE, IMG_SIZE)

    X_tmp.append(img)
    y_tmp.append(label)

  for x in datagen.flow(np.array(X_tmp), batch_size=1):
    new_image = x[0]

    X_tmp.append(new_image)
    y_tmp.append(label)

    if len(X_tmp) % 1000 == 0:
      break

  X.extend(X_tmp)
  y.extend(y_tmp)

del X_tmp, y_tmp

print("== DONUTS BACK ==")
for dir_name in label_dict.keys():
  print(dir_name)
  label = label_dict[str(dir_name)]

  X_tmp = []
  y_tmp = []

  for file_path in glob.glob(back_path + dir_name + '/*.jpg'):
    img = image.load_img(file_path)
    # img = rotate(img)
    img = image.img_to_array(img)
    img = resize(img, IMG_SIZE, IMG_SIZE)

    X_tmp.append(img)
    y_tmp.append(label)

  for x in datagen.flow(np.array(X_tmp), batch_size=1):
    new_image = x[0]

    X_tmp.append(new_image)
    y_tmp.append(label)

    if len(X_tmp) % 1000 == 0:
      break

  X.extend(X_tmp)
  y.extend(y_tmp)

X = np.array(X, dtype='float32')
X /= 255.0
y = np.array(y)
y = np_utils.to_categorical(y, len(label_dict))

データの水増しを行いながらデータセットを作成します。 ドーナツの表面だけ使用するなら、それぞれのラベルにつき1500枚までメモリ不足にならずに水増しできました。表面・裏面とも使用する場合はメモリ容量の関係で各ラベル1000枚まで水増ししました。

モデルを作成します。

def create_model():
  base_model=VGG16(weights='imagenet',include_top=False, input_tensor=Input(shape=(IMG_SIZE, IMG_SIZE, 3)))
  x = base_model.output
  x = GlobalAveragePooling2D()(x)
  x = Dense(1024, activation='relu')(x)
  prediction = Dense(len(label_dict), activation='softmax')(x)

  model=Model(inputs=base_model.input, outputs=prediction)

  for layer in base_model.layers:
      layer.trainable = False

  model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])

  return model

VGG16の事前学習モデルを利用しました。モデルにVGG16の全結合層は含まず、分類用に独自に全結合層を追加しています。また、VGG16の層は学習しないようにしています。

モデルを学習して保存します。

EPOCHS = 20
BATCH_SIZE = 64
MODEL_PATH = './drive/My Drive/donuts_detection/models/donuts_front_and_back_cropped_model_2.h5'

X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.30)

model = create_model()

history = model.fit(
    X_train, y_train,
    validation_data=[X_valid, y_valid],
    epochs=EPOCHS,
    batch_size=BATCH_SIZE
)

model.save(MODEL_PATH)

エポック数とバッチサイズは適切なものを選んで下さい。

画像内のドーナツをすべて検出し分類する

スクリーンショット 2020-03-12 17.30.46.png

必要な辞書を定義します。

label_dict = {

    'エンゼルクリーム': 0,
    'エンゼルフレンチ': 1,
    'オールドファッションハニー': 2,
    'ダブルチョコレート': 3,
    'チョコファッション': 4,
    'ポンデリング': 5,
}

inverse_dict = dict([(v, k) for k, v in label_dict.items()])

'''
{
   商品名: [値段, 熱量(kcal), たんぱく質(g), 脂質(g), 炭水化物(g), 食塩相当量(g)]
}
'''
menu_dict = {
    'エンゼルクリーム': [120, 219, 1.3, 12.0, 26.1, 0.6],
    'エンゼルフレンチ': [130, 200, 2.0, 15.5, 12.6, 0.3],
    'オールドファッションハニー': [110, 355, 3.4, 18.0, 44.4, 0.8],
    'ダブルチョコレート': [130, 265, 3.6, 16.8, 24.3, 0.5],
    'チョコファッション': [130, 330, 3.7, 20.8, 31.3, 0.8],
    'ポンデリング': [110, 219, 1.3, 12.0, 26.1, 0.6],
}

YOLOで取得したバウンディングボックスを元に画像からドーナツ部分をトリミングして分類します。

image = Image.open("../data/donut_images/multiple_front_and_back/IMG_2367.jpg")
r_image, out_boxes = yolo.detect_image(image.copy())

plt.figure(figsize=(6, 8))
plt.imshow(r_image)

X = []
for box in out_boxes:
  cropped_img = image.crop(box)
  cropped_img = np.asarray(cropped_img)
  cropped_img = resize(cropped_img, IMG_SIZE, IMG_SIZE)
  X.append(cropped_img)

X = np.array(X, dtype='float32')
X /= 255.0

preds = model.predict(X)

pred_labels = [inverse_dict[pred] for pred in np.argmax(preds, axis=1)]
result = np.zeros(6)

for label in pred_labels:
  result += np.array(menu_dict[label])

print()
print(pred_labels)

print()
print(f"値段:         {int(result[0])}")
print(f"熱量(kcal):   {result[1]:.1f}")
print(f"たんぱく質(g): {result[2]:.1f}")
print(f"脂質(g):      {result[3]:.1f}")
print(f"炭水化物(g):   {result[4]:.1f}")
print(f"食塩相当量(g): {result[5]:.1f}")
print()
image

まとめ

最後にどれだけ正確に判定できているか、分類のパフォーマンスを計算してみましょう。

def extract_labels(row):
  labels = []
  for key in label_dict.keys():
    if row[key] == '1':
      labels.append(key)
  return labels

df = pd.read_csv('../multiple_front_and_back.csv')
df['labels'] = df.apply(extract_labels, axis=1)

donuts_num = 0
detected_donuts_num = 0
corrected_classified_donuts_num = 0

print('== INCORRECTLY DETECTED ==')

for file_path in glob.glob('../data/donut_images/multiple_front_and_back/*.jpg'):
  file_name = file_path[-12:-4]
  correct_labels = df[df['file_name'] == file_name]['labels'].values[0]
  donuts_num += len(correct_labels)

  image = Image.open(file_path)
  r_image, out_boxes = yolo.detect_image(image.copy())

  X = []
  for box in out_boxes:
    cropped_img = image.crop(box)
    cropped_img = np.asarray(cropped_img)
    cropped_img = resize(cropped_img, IMG_SIZE, IMG_SIZE)
    X.append(cropped_img)

  X = np.array(X, dtype='float32')
  X /= 255.0

  preds = model.predict(X)
  pred_labels = [inverse_dict[pred] for pred in np.argmax(preds, axis=1)]

  if len(pred_labels) != len(correct_labels):
    print(file_name)

  for label in pred_labels:
    if label in correct_labels:
      corrected_classified_donuts_num += 1
      correct_labels.remove(label)

  detected_donuts_num += len(pred_labels)

print('==========================')

print()
print('The number of all donuts: {:d}'.format(donuts_num))
print('The number of donuts detected by YOLO: {:d}'.format(detected_donuts_num))
print('Percentage of donuts detected by YOLO: {:.2f}'.format(detected_donuts_num / donuts_num))
print('Percentage of donuts classified correctly out of all dontuts: {:.2f}'.format(corrected_classified_donuts_num / donuts_num))
print('Percentage of donuts classified correctly out of detected dontuts: {:.2f}'.format(corrected_classified_donuts_num / detected_donuts_num))

出力結果は以下のようになりました。

== INCORRECTLY DETECTED ==
IMG_2331
IMG_2344
IMG_2357
IMG_2356
==========================

The number of all donuts: 195
The number of donuts detected by YOLO: 195
Percentage of donuts detected by YOLO: 1.00
Percentage of donuts classified correctly out of all dontuts: 0.96
Percentage of donuts classified correctly out of detected dontuts: 0.96

つまり、ドーナツはYOLOによって100%検出され、すべてのドーナツ(検出されたドーナツ)を96%の割合で正しく分類できています。
このシステムにより、今まで手動で行っていたドーナツのレジ計算を自動で行うことができます。

もちろん、ドーナツだけではなく、お弁当詰めにミスがないかチェックしたり、工場の生産ラインで不良品を弾くこともできます。


Twitter・Facebookで定期的に情報発信しています!

世界の人口推移と起こりうる問題

日本だけでは人口減少と言われていますが、世界を見ると人工は増加すると予測されています。 2019年に国連が発表した、世界人口推計2019年版 データブックレットによると2050年に97億人、2100年には110億人まで増加すると言われています。
5902c9be50a0cb27b5b66f0daaecf766.png

人口増加分の8割ほどをアフリカが占めています。
各国はアフリカが巨大なマーケットになると予測して、国を挙げて進出を加速しています。中国はこれまでに6900億ドル以上をアフリカに投資しており、日本では2016年8月にケニアで開催された第6回アフリカ開発会議(TICAD)にて、アフリカに300億ドル単位の投資を行うと発表しています。

アフリカを始めとした各国で人口増加すると問題に挙がるのが「食糧問題」です。 日本以外にも北米の各国など、人口減少すると予測されている国もあり、今まで以上に効率的な食料供給が求められます。


各国の農業

2012年の農作物輸出額は1,449億ドルと世界トップのアメリカは、広大な土地を活かし、大型の農業機械で少ない種類の作物を最適な環境で作る大規模農業を採用し、高い生産性を保っています。

スクリーンショット 2020-03-12 14.29.23.png

2位のオランダは、決して広くはない農地で効率の良い生産で高い輸出高を保っています。 最新の情報通信技術(ICT)や環境制御技術を駆使した「スマート・アグリ」を導入し世界トップレベルの土地生産性を保っています。


日本の農業

日本はかねてから集約農業を採用していますが、コストがかかり農作物単価は高くなるため世界市場では戦いにくい状態です。近年の海外における日本食ブームや 2013年に「和食」がユネスコ無形文化遺産に登録されたことを受けて、コストを下げた大量生産をおこなうために日本でも大規模農業を進める動きがあります。

また、日本では農業に従事する人が増えています。 個人数は減少していますが、法人化して農業を行う経営体が急増(2000年:5,272経営体→2017年:21,800経営体)しており、"サラリーマン"として農業が出来る働き先が増えています。

2009年の農地法改正で農業参入が全面自由化になり、企業の農業参入も増加(2000年:5,272経営体→2017年:21,800経営体)したことで、増加に拍車をかけています。

農家数が減少はしたものの若い農業従事者が増え、企業での大規模農業の採用...。
日本でもデータに基づく効率的な農業をおこなうことでより高い生産性を実現できそうです。


機械学習を農業に活用するサービス

農場をデジタル管理する Climate社 FieldView

最高の生産性を実現するために、天候情報、窒素量、畑の健康状態などを監視してダッシュボード化し、収量目標に合わせた作付けプランを提供します。 広大な農地でも、現在の状況がダッシュボード化されるので管理しやすく、意思決定を助けます。農業でSFAを活用しているかのようです。

スクリーンショット 2020-03-11 16.54.12.png

実際の画面です。
左から、マップを並べて収穫量等を比較している画面、現状の良し悪しを判断し、適切な意思決定をするための収集分析、更に詳細な分析のために領域ごとに土地の価値を判定する画面、です。

その他にも機械学習を活用してトウモロコシの病害診断をおこなったり、それぞれの農地で何が成功して何が失敗したかを科学的に分析するための収益分析をおこないます。


航空映像から生育マップを作成する Mavrx社 Taranis

ドローン等で撮影した空中映像を、葉に乗っているカブトムシを数えられるくらいの高解像度の画像処理をして衛生画像と組み合わせた生育マップを作成します。

jared-brashier-duNHkmSkW6M-unsplash (1).jpg

撮影された写真は植物の健康と品質を評価するディープラーニングエンジンによって分析されます。ディープラーニングエンジンは、最先端の数学モデルとクラウド上のハードウェアプラットフォームを使用し、60人以上の専門の農学者によって訓練され、1,000,000を超える作物の健康問題の例を提供しています。

例えば、雑草を早期発見し適切な除草剤の作成を支援したり、作物の生育不良を特定して対処方法をユーザーに知らせるなど、適切な対処のための指南をしてくれます。


今後の方針

上記事例のように、従来の集約農業から大規模農業に変化するための仕組みが提供されはじめました。 また、農業へのノウハウがなくとも高品質な生産ができるようにデータの可視化だけではなく、対処法まで指南してくれるようになり始めています。 2050年までの人口増加へ準備が必要な段階になっています。日本では労働人口が減っていますが、生産やサービスの需要は減りません。いかに効率よく生産できるか、生産性を上げられるかがこれからの農業のカギになるでしょう。

当社でもAI・機械学習を活用したソリューションを提案しています。


アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める


会社概要はこちら


Twitter・Facebookで定期的に情報発信しています!


参考

世界人口推計2019年版 データブックレット

農林水産省「平成29年一般企業の農業への参入状況」

概要

自分に似合う色、引き立たせてくれる色を知る手法として「パーソナルカラー診断」が最近流行しています。

パーソナルカラーとは、個人の生まれ持った素材(髪、瞳、肌など)と雰囲気が合う色のことです。人によって似合う色はそれぞれ異なります。 パーソナルカラー診断では、個人を大きく2タイプ(イエローベース、ブルーベース)、さらに4タイプ(スプリング、サマー、オータム、ウィンター)に分別し、それぞれのタイプに合った色を知ることができます。


パーソナルカラーを知るメリット

  • 自分をより好印象に見せることができる
  • 自分に合うものを知って、買い物の無駄を減らせる
  • 本来の魅力を発見できる


現在、「パーソナルカラー診断」と検索すると、膨大な量のページが見つかります。しかしそれらのほとんどは設問に自分で答える自己申告タイプでした。

ほんとにこれで合ってるの?と疑問に感じることもあるでしょう。
専門家に見てもらうにはお金も時間もかかるし正直面倒臭い。写真や動画で、自宅で気軽に判断できたらいいのに...なんて思いませんか?


今回は、「パーソナルカラー診断サービス」を機械学習を用いて製作しました!


どうやるの? 機械学習のしくみ

今回の作業の流れです。
①画像を収集→②パーソナルカラー(4パターン)の正解を付け→③モデルを作成→④モデルに②の画像を学習
→⑤学習させたモデルに新たな画像を投入(テスト)→⑥画像に対してパーソナルカラーを判定→⑦精度向上のための考察


この作業で大まかには正解のパーソナルカラーを予測できるシステムが作成できました。
技術を詳しくご紹介します。


訓練データの確保

[芸能人の名前 パーソナルカラー] で調べると、その人のパーソナルカラーが分かります。それを参考にして判定用のモデルを作成しています。
学習をイチからするためには相当量のデータが必要なので、今回は予め学習されたモデルの一部を基にして層を追加する転移学習という手法でモデルを作成しました。

実装はkerasを用いて行います。kerasでは様々な事前学習済みモデルが用意されています。

ImageNet検証データでのスコアがそれぞれ出ていますが、どのモデルが今回のケースに一番うまくマッチしてくれるかは試すまでわからないのでひとまずVGG16と、ここでのベンチマークで一番精度の高いInceptionResNetV2を選びました。
InceptionV3という別のモデルもありますが、所々 InceptionResNetV2をInceptionモデルと略すところがあります。


Applications.jpg (引用)https://keras.io/applications/


├─personal-color
│ ├─data
│ ├─images
│ │ ├─autumn
│ │ │ └─original
│ │ ├─spring
│ │ │ └─original
│ │ ├─summer
│ │ │ └─original
│ │ └─winter
│ │ │ └─original
│ ├─scripts

というフォルダ構造で季節ごとに階層を分け、収集してきた画像をoriginalに格納しています。この時、画像の名前は、通し番号のみで管理しています。
この後学習させるにあたってパーソナルカラーを決める上で重要な要素となる顔の形や目だけにトリミングして別画像として保存することを考えたため、originalという形で保存しています。

収集した画像から顔を切り取るのに加えて、目だけ、口だけを切り取るために、dlibのランドマーク検出を使います。
ランドマーク検出とは、顔から要所となる点を検出するものです。


facereg.jpg (引用)https://docs.opencv.org/master/d2/d42/tutorialfacelandmarkdetectioninanimage.html


import logging
import os
import shutil

import cv2
import dlib
import numpy as np
from PIL import Image, ImageFilter
import keras
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential, Model
from keras.layers import Input, Dense, Dropout, Activation, Flatten
from keras import optimizers
from keras.applications.vgg16 import VGG16
from sklearn.model_selection import train_test_split


LABELS = ['spring', 'summer', 'autumn', 'winter']
PARTS = ['face', 'eyes', 'mouth']

for season in LABELS:
    pathList = ['../images', season, 'original']
    rootPath = os.path.join(*pathList)
    files = os.listdir(rootPath)
    files.remove('.DS_Store')

    for file in files:
        filePath = os.path.join(rootPath, file)

        img = cv2.imread(filePath)
        rects = detector(img, 1)
        PREDICTOR_PATH = ('../data/shape_predictor_68_face_landmarks.dat')
        logging.debug('--- fetch each coordinates from settled index ---')
        for rect in rects:
            face = rect
            predicted = predictor(img, rect).parts()
            left_eye = predicted[36:42]
            right_eye = predicted[42:48]
            mouth = predicted[48:]
            partsList = [left_eye, right_eye, mouth]
    logging.debug('--- trimming and save images ---')
    savePart()  # 上で求めた領域をそれぞれトリミングする。
一部略


モデルの作成

画像を入力用に再度加工し、モデルを作っていきます。
訓練用データは少し水増しを加え、テストデータはそのまま使います。前述の通り今回はVGG16とInceptionResNetV2を使っています。


def imagePreprocess(self):
    trainDataGen = ImageDataGenerator(rescale=1 / 255,
                                      shear_range=0.2,
                                      zoom_range=0.2,
                                      rotation_range=60,
                                      brightness_range=[0.8, 1.0],
                                      horizontal_flip=True,
                                      vertical_flip=True)
    self.trainGenerator = trainDataGen.flow_from_directory(directory=self.trainFolder,
                                                           target_size=(
                                                               self.IMG_HEIGHT, self.IMG_WIDTH),
                                                           color_mode='rgb',
                                                           classes=LABELS,
                                                           class_mode='categorical',
                                                           batch_size=self.BATCHSIZE,
                                                           shuffle=True)

    testDataGen = ImageDataGenerator(rescale=1 / 255)
    self.testGenerator = testDataGen.flow_from_directory(directory=self.testFolder,
                                                         target_size=(
                                                             self.IMG_HEIGHT, self.IMG_WIDTH),
                                                         color_mode='rgb',
                                                         classes=LABELS,
                                                         class_mode='categorical',
                                                         batch_size=self.BATCHSIZE,
                                                         shuffle=True)


def vgg16Model(self, summary=False, name='model', verbose=1, lr=1e-4, epochs=25, freezefrom=0, optimizer='RMSprop'):
    input_tensor = Input(shape=(self.IMG_HEIGHT, self.IMG_WIDTH, 3))
    vgg16 = VGG16(include_top=False, weights='imagenet',
                  input_tensor=input_tensor)
    if summary:
        vgg16.summary()
    top_model = Sequential()
    top_model.add(Flatten(input_shape=vgg16.output_shape[1:]))
    top_model.add(Dense(256, activation='relu'))
    top_model.add(Dropout(0.5))
    top_model.add(Dense(len(LABELS), activation='softmax'))
    self.model = Model(inputs=vgg16.input, outputs=top_model(vgg16.output))
    if summary:
        self.model.summary()

    vgg16.trainable = True

    if freezefrom == 0:
        for layer in vgg16.layers:
            if layer.name == 'block5_conv1':
                layer.trainable = True
            else:
                layer.trainable = False
    else:
        for layer in vgg16.layers[:freezefrom]:
            layer.trainable = False

    if optimizer == 'RMSprop':
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=optimizers.RMSprop(lr=lr), metrics=['acc'])
    if optimizer == 'SGD':
        self.model.compile(loss='categorical_crossentropy',
                           optimizer=optimizers.SGD(lr=lr), metrics=['acc'])

    history = self.model.fit_generator(self.trainGenerator, steps_per_epoch=25, epochs=epochs, validation_data=self.testGenerator,
                                       validation_steps=10, verbose=verbose)
    self.history.append(history)
    self.model.save(os.path.join(
        *[self.baseDir, 'data', name + '.h5']), include_optimizer=False)


def inception_resnet(self, name='model', lr=1e-4, epochs=25, trainFrom=0):

    resnet_v2 = InceptionResNetV2(include_top=False, weights='imagenet',
                                  input_tensor=Input(shape=(self.IMG_HEIGHT, self.IMG_WIDTH, 3)))
    model = Sequential()
    model.add(Flatten(input_shape=resnet_v2.output_shape[1:]))
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(len(LABELS), activation='softmax'))

    if trainFrom == 0:
        resnet_v2.trainable = False
    else:
        for layer in resnet_v2.layers[:trainFrom]:
            layer.trainable = False

    self.inception_model = Model(
        input=resnet_v2.input, output=model(resnet_v2.output))
    self.inception_model.compile(
        loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc'])

    hist = self.inception_model.fit_generator(
        self.trainGenerator, epochs=epochs, validation_data=self.testGenerator, steps_per_epoch=25)
    self.history.append(hist)
    self.inception_model.save(os.path.join(
        *[self.baseDir, 'data', name + '.h5']), include_optimizer=False)


結果は?

目と口のみで学習させたモデルの結果はval accが0.25に非常に近いものでした。4クラス問題なので、これでは全く意味がありません。

一方顔全体での結果は以下の通りでした。


Inception
Epoch 25/25
25/25 [==============================] - 18s 709ms/step - loss: 0.7033 - acc: 0.7200 - val_loss: 2.7571 - val_acc: 0.4781
VGG16
Epoch 25/25
25/25 [==============================] - 11s 458ms/step - loss: 1.0617 - acc: 0.5225 - val_loss: 1.2682 - val_acc: 0.4230

学習時間はColab Tesla T4でInceptionが約10分、VGGが5分ほどでした。


決して非常に高機能なモデルとは言えませんが、目のモデルと比べると顔全体を使用したモデルが良さそうです。何より、私自身がパーソナルカラー診断をしたら確実に0.25を下回るくらい難しい分類だったので満足の行く結果に見えます。過学習していなければですが。
ということで過学習に震えながら別のテストをすると、内実は惨憺たるものでした。

VGGモデルに関しては、少し夏と冬が多くあとはほぼランダムな出力でした。上振れでテストスコアが上下するような感じです。
一方Inceptionモデルは、夏と冬のテストに関しては約8割ほどの正解率でした。しかし、春と秋はほとんどが夏、冬と回答されていて、春か秋と答えられたのは、100件中2件ほどでした。オリジナルデータ数はこの時すべて同じ枚数で設定していたのでこのような偏りはすごい不思議なものでした。


どうしてこうなったのか原因を考えていきます。


精度向上のための原因考察

仮説その1 パラメータに問題がある

ハイパーパラメータに問題があって過学習している可能性を考え、learning rateを1e-2 - 1e-5まで変化させてテストをしました。また、ファインチューニングという新しいモデルを追加するだけではなく、以前のモデルの一部を学習時に用いるという手法も試しました。

結果として、概してval accの結果が良いのは1e-4のときでした。

1e-5では、25epochsだと少したりないような印象を受けました。上述のスコアも1e-4にしたときのスコアです。しかし、スコアの微小な上下はあれど、本質的な偏りの修正には至りませんでした。


仮説その2 モデルがそもそもあっていない

人間の顔をその雰囲気から分類するというタスクがこれらのモデルにあっていないのではないか。しかし、これを言ってしまうと本末転倒です。
もともと訓練データを集めづらい分野において、予め学習してあるモデルを転用するというコンセプトが転移学習ですし、一旦考えなかったことにします。


仮説その3 訓練画像の質が悪い

画像の質と言っても、様々な要素があります。

画質、水増しでゴミができていないか、正しいクラスに分類されているかetc...
今回訓練に使ったのは芸能人の画像でした。もともと、化粧や照明の影響で印象が変わることは危惧していましたが、とりあえずモデルに投入していました。 今一度初心に帰り、これらを見直すことにしました。

基準が私では判断ができないので、当社腕利きのパーソナルカラー診断士が人の目で答えがわかっているテスト画像を再度精査をしました。

すると驚くことに、VGGモデルで、学習機の導き出していた答えが人の目の意見と一致するものが多々ありました。
人の目でも即座に判断できるものは正解しており、判断が難しいものに関しては、イエローベース、ブルーベースの2択までは絞り込めるという感覚でした。

つまり、テストデータとして与えていたラベルが間違っていただけで学習機は頑張って学習していたのに、画像を収集する際にこの人はこの季節、とその写真のときの状態を見ずに決めてしまっていたため引き起こされてしまったのです。

この結果を受けて、再度すべての画像を再分類することにしました。
VGGモデルでは偏りが減り、正解率も微小ながら上がりました。しかし、Inceptionモデルでは逆に夏と冬しか結果として出力されないようになってしまいました。
このモデルは(他もそうですが特に)非常に複雑なモデルなので、難しい学習の果てに夏と冬だけに焦点をあてた方が精度が上がると判断されてしまったのかもしれません。データ数に不均衡はないので今回は仮説その2として切り上げます。

(参考)https://qiita.com/koshian2/items/20af1548125c5c32dda9


まとめ

一番の原因がデータ処理が甘かったというなんとも情けのないものでした。

色々なところで色々な人が機械学習の8割は前処理といったことを口を酸っぱく言っている意味を再度認識しました。
また、とんでもなく巨大なBiTという新モデルが2019年の12月に発表されたので、次回はこれも試してみたいです。

(参考)https://qiita.com/omiita/items/90abe0799cf3efe8d93d


AI・機械学習を活用したシステムが少しずつ普及しています。今回のように画像を用いた判定・予想は人の手をシステムに代替するために便利な手法です。
例えば、人がおこなっている不良品チェックを機械学習でおこなったり、複数の散乱している物をなにであるか判定し金額を表示することで無人レジを作成したり...。
リモートワークや自由な働き方が進んでいる中、人間とシステムが上手に共生する社会がすぐそこまで迫ってきています。

当社ではAI・機械学習を活用したソリューションを提案しています。


アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める


会社概要はこちら


Twitter・Facebookで定期的に情報発信しています!

「思っていたよりいい!」
購入した商品を使ったとき、こう思えると嬉しいですね。

重要なことは『思っていたより』という点で、私たち提供者は常にお客様の期待を超えていかねばなりません。
驚きと喜びが両立して初めて感動が生まれ、リピーター、そしてファンになってもらえるのだと思います。

そんな『いい!』と思ってもらうための重要な要素である品質。
今回はAI・機械学習を活用して品質を向上し、高品質を保つ事例をご紹介します。


スクリーンショット 2020-03-05 17.07.21.png

品​​質向上のための機械学習活用

機械学習が、機器を適切に動作させ、材料または工程順序の変更が製造内容に影響しないようにすることで、製造者がより良い製造工程と品質を保つことを手助けします。

まず、製造機器に取り付けられたセンサーで、信号を収集、監視し、機械の動作データと温度、相対湿度、その他の環境データなどの周囲のセンサーデータの両方を追跡できます。
次に、機械学習を使用して、この過去データとリアルタイムプロセスデータを比較します。品質に影響する条件が検出された場合、製造完了前に修正が可能です。

1日あたり5,000万回以上の溶接をする、ある自動車メーカーでは、低品質な溶接に気付き一定の品質を保つためにシステムが活用されています。
品質の低い溶接を発見した際には、溶接をやり直し、部品を完全に廃棄し、部品をキューに戻す時間のロスと金額のコストを削減しており、
各溶接ロボットからは、トルク、電流、モーターの1分あたりの回転数、アーク時間、および供給されたワイヤの太さを測定する信号を含む15の信号が収集されています。
同社は既知の高品質な溶接の信号をロボットからリアルタイムで取得するデータ信号と比較することで、溶接品質の良し悪しをリアルタイムで検出できます。

機械学習は、新しい異常を検出するためにも使用されます。異常はシステムにフィードバックされ、アルゴリズムを改良および改善します。
最終結果として、不良溶接の検出率は98%になり、再溶接が必要な溶接数の5倍減少しました。手動ではできなかった検知・分析によりコストと時間の両方が大幅に節約されています。


機械学習による品質基準チェック

品質基準を満たしていることを保証するためにもAI・機械学習は活用されています。

通常、製品の目視検査は、生産中または完成後に行われます。以前は人間が検査していましたがやはり疲労や速度に限界がありました。
また、人間には健康状態(アレルギー、病気、ストレスによる視力低下、白内障、黄斑変性、円錐角膜などの検出されない状態など)の悪い時があり、それが目視検査に影響を与える可能性があります。
マシンビジョンと機械学習を活用することで、機械と人間が適切に役割分担をし、製品検査工程の効率、精度、再現性の向上が実現します。

Landing.AIは、Google Brainの開発を率いた著名な機械学習エキスパートであるAndrew Ngによって設立された新しい会社です。
マシンビジョン、オブジェクト識別、および機械学習を組み込み、AIを業務の工程に統合できるようにしています。
以前の目視検査システムは、全ての欠陥を確実に認識するために約100万枚の画像データでトレーニングする必要がありました。新たなLanding.AIのシステムは5つの製品画像のみをレビューした後に欠陥のパターンを認識することができます。Landing.AIのディープラーニングは部品の検査に0.5秒で済み、多くの場合人間よりも正確だと言われています。

機械学習での画像認識に必要なデータ量と時間を削減するもう1つの例に富士通研究所の事例があります。
今までは、製造ラインや部品を変更する場合、検査システムも改訂して、画像データのデータベースが最新であることを確認する必要がありましたが、同社の既存の画像認識システムプログラムの目標と目的は事前に設定されていましたが、新しい製造ラインを開始する際にに使用できる画像データの量は限られていました。
富士通は、システムをテンプレート化して画像認識アプリケーションを構成する、学習プロセスを高速化する専門の遺伝的プログラミングに注目しました。たとえば、テンプレートを使用すると、学習と認識のプロセスを3つのプロセス(画像処理、しきい値処理、バイナリ画像処理)に絞り込むことができます。プログラムは正常な部品と欠陥のある部品の画像からトレーニングデータを準備して合格/不合格の判断を下すことにより、自動的に学習し、進化します。
このシステムを部品の組立ラインでテストすると、検査用のコードを自動的に生成しほぼ100%の認識率を達成しました。

その結果、プログラムを開発する時間が80%短縮され、調整が行われても97%以上の認識率を維持しながら、同社の部品組立機が再学習できるようになりました。


スクリーンショット 2020-03-05 17.07.02.png

機械学習でファン化を進める?

お客様は多くの情報を持ち、膨大な選択肢から購入の意思決定をます。また、一度購入したから安心できるわけでありません。買い替え(リプレイス)の決断はとても早く、容赦なくやってきます。

しかし、ファンになってしまえばどうでしょうか?
一度ファンになると簡単には離れません。それどころか、他の製品も好きになってもらえるでしょう。

品質はそんなファンを作る大きな要因です。

まだまだ機械学習の活用は発展段階ですが、品質向上、維持のためのAI活用は順調に進んでおり、2025年までに4億1,820万ドルの年間収益を生み出し、アジア太平洋(1億3,380万ドル)と北米(1億1,710万ドル)が市場を牽引すると予測されています。

品質向上、維持のために当社でもAI・機械学習を活用したソリューションをご提案します。


アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める


会社概要はこちら


Twitter・Facebookで定期的に情報発信しています!

エネルギー分野における課題

エネルギーの供給と消費は金融および社会環境コストの観点から企業・国民のリスクの1つであるため、現在は再生可能エネルギーへの関心が高まっています。 ブルームバーグ・ニュー・エナジー・ファイナンスのニューヨークに拠点を置くアナリスト、カイル・ハリソンは以下のように話しています。

「100%再生可能エネルギーを使用すると宣言している企業もある。そのような企業の増加により、政府の補助金に関係なく、再生可能エネルギーの活用検討が促進される。」


再生可能エネルギー分野におけるAI・機械学習活用可能性は、気象予測の改善だけではなくエネルギー消費要因全般にも関連しています。 今回は海外事例から再生可能エネルギー分野のさらなる可能性を紹介します。


スクリーンショット 2020-03-05 14.50.37.png

機械学習を活用した事例 5選

再生可能エネルギー需要量予測

特定の日においてエネルギー需要がどれだけ発生するか予測します。 過去の時間ごとのエネルギー消費量データを機械学習に学習させて予測モデルを作成します。 正確なエネルギー需要と消費を予測することで、施設や建物の管理者、エネルギー会社、公益事業会社が省エネポリシーを展開するために使用できます。企業では予測データを活用し、運用とエネルギー貯蔵システムを最適化する方法を計画立てることができます。 また、顧客ごとに必要エネルギー量を予測し、最適な契約容量を提案することで、エネルギー費用のコストを最小限に抑えることができます。


再生可能エネルギーの供給量予測

ドイツでは既に再生可能エネルギー分野において機械学習が活用されています。 たとえば、エネルギー量の不足を事前に察知するために、国内の風力タービンとソーラーパネルのリアルタイムデータを分析して用意できるエネルギー量を予測します。2日間分のエネルギーが用意できるかどうかを基準として不足可能性があるとアラートで知らせます。

また、IBMでは再生可能エネルギーのために天気パターンを予測支援できる機械学習のシステムを独自に開発しました。 Self-Learning Weather ModelおよびRenewable Energy Forecasting Technology(SMT)と名付けられ、1,600の気象観測所、太陽光発電所、風力発電所、および気象衛星から取得したデータを分析します。SMTの天気予報は、National Weather Serviceがまとめたものよりも最大30%正確です。

上記の2つの事例は再生可能エネルギーの収集量を予測するために役立っています。


再生可能エネルギーの最適価格決定

需要と供給が予測できるようになったことで、エネルギー価格の最適値を予測することができます。従来の価格設定システムに比べていくつかの利点があります。

  • ニューラルネットワークは人では管理できない膨大な量のデータを分析できる
  • エネルギーの供給と需要の間の非線形相関を学習して、直感に反してデータに基づいた設定価格を推奨できる
  • ビッグデータ主導の価格戦略は可視化できる
  • 価格管理者の業務時間を短縮し、高レベルの意思決定のみが業務として残すことができる


スクリーンショット 2020-03-05 14.49.59.png

風速変動予測による風力発電地の検討

マサチューセッツ工科大学(MIT)の研究者は、一定期間の風速の変動をより迅速に予測できるシステムを開発しました。 このシステムにより、公益事業会社や再生可能エネルギーの新興企業は、風力発電所の候補地をより早く見つけられます。 候補地発見のためのデータ収集は電力会社がおこなうと、最大で12か月程かかりますが、MITが開発したような機械学習を活用したシステムでは、わずか3か月のデータに基づいてモデルを作成します。しかも従来のデータ収集よりも正確に予測ができます。


エネルギー消費量を利用した機器異常の検出

機械学習でエネルギー消費を常に監視、分析し、異常を検出します。 電力が消費されている中でどこでどのくらい電気が使用されているかを確認するのは難しく、機器の誤動作を検出することも難しいです。システムに障害が発生したり、構成が誤っていると、火災などの悪影響が生じる可能性があり、このシステムは大きな経済的損失を防ぎます。

人工知能アルゴリズムの開発により、スーパーマーケット、高校などを自動的に定義し、エネルギー消費に基づいて異常をリアルタイムで検出および分類できます。このようなソリューションは、リアルタイムでエネルギー消費の異常を自動的に検出し、非常に迅速に意思決定できるユーザーに通知します。大きな経済的損失を避けるのに役立ちます。


今後のエネルギーの移り変わり

最近まで再生可能エネルギーは予測不能であったこともあり、現時点では世界のエネルギー需要を満たすために化石燃料は必要不可欠です。 AIも化石燃料の探査・生産コストを削減し、配送を合理化することで化石燃料の供給を支援しています。

AIは、再生可能エネルギーと同じくらい化石燃料を強化できますが、化石燃料の持続不可能性が考慮すると、長期的に見た理想的なシナリオではありません。
最終的には、再生可能エネルギーが化石燃料に取って代わると予想され、AI・機械学習の活用は再生可能エネルギーの普及を助けるために役立っていくでしょう。


当社でもAI・機械学習を活用した課題解決をご提案しております。


アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める


会社概要はこちら


Twitter・Facebookで定期的に情報発信しています!

機械学習のアルゴリズムがつくりだす状況を利用して、自然実験に近い分析をおこなった事例を紹介します。
このような事例を応用すれば、実際に実験をおこなわなくても介入効果などが分かるかもしれません。


はじめに

昨今、AI・機械学習の進歩のおかげで、様々な予測をおこなうことができるようになりました。
みなさんも機械学習を使った株価の予測などニュースでみかけることも増えたと思います。
株価だけでなく、交通量からチケットの売上・電力消費量etc......
なんでも予測されていますね。笑
このように2019年現在、たくさんの企業がなんらかの予測をするためにデータを集めています。


今回はこうした集めたデータを利用して、さらに分析をした事例を紹介します。
※正確に表現すると機械学習アルゴリズムが作った状況を利用して分析する事例です。


介入効果とは

介入効果と書くとピンと来ませんが、おこなったアクションに効果があったのかということです。

ある会社で商品の宣伝のために、全国でテレビCMをおこなったとします。
その結果、商品の売上が30%も上がりました! すごい! これからどんどんテレビCMを放送しよう!


本当にこれで良いでしょうか?


クリスマス時期のため売上が上がったかも...。(実際に多くの売上のデータでは季節調整がされています。)
もしくは、有名人がたまたまSNSでその商品の写真をupしたことで、若者を中心に大流行したからかも...。


テレビCMはお金をかけてやる必要があったのでしょうか?
広告の効果を正確に知るには、広告以外の状況が同じ店舗の売上を比べればわかります。(ざっくりいうとほぼ状況が同じものを比較する)


この場合だと、地域ごとにテレビCMを放送する地域、しない地域で分け、さらに売上状況や天気等、条件を揃えて比較する必要があります。


残念ながらこのような状況を意図的に作り出すのは難しいです。
より多くクリックされるweb広告を比較したり、奨学金の効果など、状況を同じにして効果を実験したい例はたくさんあります。


こうした詳しく原因を分析することを因果推論といいますが、これについては当社の記事「はじめての因果推論」を参考にしてみてください!


アルゴリズムが生むランダム化実験

ここで登場するのが、機械学習のアルゴリズムを利用して得るデータです。
需要と供給によって価格が変わるUberXのデータを使って、利用者がどれくらい価格に反応するか(価格弾力性)を測る分析を紹介します。
ここでネックなのが、価格だけの影響を知りたい場合に、どうやって他の要因を排除するか...
この点は、先程のテレビCMの効果を測る例と共通しています。


ここで役立つのが、機械学習を使ったアルゴリズムで集めたデータです!
Uberはもともと状況に応じて、自動で価格を上げ下げする仕組みです。そのためアルゴリズム内部では、1.249など少数点以下もしっかり計算されています。
しかし、利用者はそこまで細かい金額では払えないので、少数点第二位以下を四捨五入して表示するようプログラムされています。
ここにランダム化実験を見出すことができます。
つまりUberでは、1.249は1.2と表示され、1.251 は1.3と表示されることになります。
しかし値段以外の要因は1.249と1.251では、ほとんど同じです。よってこの2つで比較すれば、価格が利用者にどう影響するかを明らかにできます。


アルゴリズムが生むランダム化実験の応用性

このように、機械学習のアルゴリズムで集めたデータに自然実験が行えるような例は、たくさんあるのではないでしょうか?
例えば、裁判官の判決や奨学金を与えると生徒はどうなるのかなどです。
実際サイバーエージェントでは、こうした手法を使い広告の効果を測定する研究も行われているそうです。


このような手法を使えば、ランダム化実験や人為的なABテストなど、時間やコストが多くかかるプロセスを
回避できるかもしれません。


参考文献

・矢田紘平、成田悠輔「機械学習は自然実験を作り出す」『経済セミナーe-book No.15』、日本評論社、2019年12月、19-20ページ
・Cohen, Peter, Robert Hahn, Jonathan Hall, Steven Levitt and Robert Metcalfe (2016) "Using Big Data to Estimate Consumer Surplus: The Case of Uber,"NBER Working Paper 22627.
・Narita, Yusuke, Shota Yasui and Kohei Yata (2019) "Efficient Counterfactual Learning from Bandit Feedback,"Proceedings of the Thirty-Third AAAI Conference on Artificial Intelligence, pp.4634-4641.


Twitter・Facebookで定期的に情報発信しています!

はじめに

 ドーナツを買おうと店内を覗くと、大勢の人が並んでいて買う気をなくしてしまうことがよくあります。

行列を解消すると更に多くの人がドーナツを買い、売上げアップはもちろん、新しいお客さんを獲得するチャンスにもなるのでは...。と気づきました。
そのために店頭業務をスピードアップしてお客さんを待たせない仕組みを作ることが必要です。今回はドーナツ屋さん店頭業務の効率化について考えてみました。

現状、時間短縮の要因は

  • お客さんがドーナツを選ぶ時間が長い
  • ドーナツをレジ打ちする時間が長い、またはミスがあり時間がかかっている

    お客さんにより満足してもらうために、2点目に注目し実現方法を検討しました。


レジ打ち自動化にむけての課題

 現在、レジ打ちの自動化を実用しているお店はよく見かけます。例えば、GUではRFIDを用いてカゴを機械の中に入れただけで商品が登録され、お会計に進めます。しかしこれをドーナツに適用するのは難しいです。
なぜならば、ドーナツそのものにタグは付けられません。タグを付けることなく、GUのような無人レジを実現するにはどのようにすればよいでしょうか。
この問題は機械学習を使うことで解決できます。


解決策|機械学習を用いたドーナツの無人レジ


 機械学習を用いてドーナツの検出と判定を行い、名前と金額を表示しました。
精度は95%以上でドーナツが裏返っていても問題なく検出できています。

 このようなドーナツ検出器があれば次のような利点があります。

  • 機械が判別し、レジでの時間短縮
  • 回転率が上がり、多くのお客さん対応ができる
  • 従業員を使わずに会計ができ、人件費削減  - 人の疲れによる見落とし、ミスがなくなる


ドーナツ検出の応用

 機械学習でのドーナツ検出により、RFIDを使うことなく無人で金額の計算をすることができました。
これにより、タグを付けることができない商品にも無人レジで対応することができます。

 また、農作物の最適な収穫時期を知らせる機械にも応用する事ができます。
収穫する予定の農作物の写真を撮り、機械が今収穫することが最適か判断します。人が農作物の最適な収穫時期を判断するには慣れるまで時間がかかりますが、機械が行えばそのような時間は必要ありません。


終わりに

 今回はドーナツの無人レジによってどのようなことが実現可能かを記事にしました。
次回は、ドーナツ検出の技術を紹介します。


Twitter・Facebookで定期的に情報発信しています!

医療・ヘルスケア分野での機械学習検討状況

2019年6月にロンドンで開催されたAIサミットのヘルスケアAIストリームで実際のヘルスケア問題を解決するための魅力的な機械学習活用事例が発表されました。

医療の課題をいくつか考えてみましょう。

  • 圧倒的な量はあるがオフライン上にあり活用できないデータ(紙カルテ等)
  • 病気や健康など、性質上予測が困難なモノ(いつどんな病気にかかるか予測しにくい)


現在は機械学習を活用し、異なるデータの分析と予測、および日常的な作業の自動化について検討しており、成功したときはこれ以上ない程の大きな影響を与えると予想できます。

本記事では現代の課題に即している2つの事例ご紹介します。

  • Cleveland Clinic『病気治療と入院期間の予測』
  • HiveとCarers UK『最適なシニアケアで自立生活支援』


Cleveland Clinic『病気治療と入院期間の予測』

非営利団体のCleveland Clinicは年間540万人の患者の診察を行っている団体です。
Cleveland ClinicロンドンのCEOであるBrian Donley博士は業界最大の課題の1つである『医療従事者の燃え尽き症候群』へのAIを活用した対策を解説しました。

博士によると燃え尽き症候群に罹る人は平均で23%にもかかわらず、医療従事者は54%と多くいます。特に医師は更にストレスにさらされているそうです。 多大な業務負担により燃え尽き症候群が発生していると考えられるため、早急に負担を軽減しなければなりません。

技術の発達は諸刃の剣です。
技術の発達により医師が作成する必要がある情報と読み込む情報(43,000の医学雑誌、810,000の専門記事、患者が入力したデータ、試験など)が増加し、業務量も増加します。しかし、AIにとっては活用できるデータが増えるのでありがたい状態になります。 Cleveland Clinicはこの状況を利用し、医師がより効率的に治療に専念できることを目指し患者への分析と予測にAIを使用しています。

Cleveland Clinicは再入院の有無と滞在期間・個人の生存状態等の10億点ほどのデータから、退院後の患者はかなりの数が再入院していることを発見しました。
また、臨床データ、人口統計データ、および併存疾患データを分析してパターンを理解し、ある病気の治療方法と入院期間の予測モデルを構築しています。その予測結果で再入院の可能性と入院期間の大幅な短縮がされています。
現在は患者の状態を考慮して組織は必要な人員と期間を予測し配置しています。これは患者にとってより良い結果になっただけではなく、病院側もより適切にスタッフを配置できるようになりました。

スクリーンショット 2020-02-21 12.03.38.png

HiveとCarers UK『最適なシニアケアで自立生活支援』

HiveとClarkとCarers UKは「The Changing Face of Care (変化するケアの顔)」のテーマで発表しました。
Nonprofit Carers UKが共有したデータでは以下のことが明らかになっています。

  • イギリスの介護者は650万人ほどいる
  • そのうち介護と仕事の両方をしている人は300万人、高齢者の介護と子どもの世話をしている人は150万人ほどいる
  • 介護者の72%がメンタルヘルスの問題を抱えている
  • 65歳以上の半数が必要な介護について話していない
  • 40〜60歳以上の半数も親にどのような支援ができるかを話していない


これでは介護者の負担が大きいだけでなく、いざ介護が必要になった時にスムーズな介護ができません。


HiveはCarers UKと複数のパートナーと協力し、高齢者が自立して生活できるような監視システムを検討しました。
このシステムには高齢者の自宅での生活をリモートで監視する介護者向けのモバイルアプリも含まれています。
自宅のセンサーは、テレビ・ケトル・トースター・食器棚・ドア・リビングルーム・キッチンなど、様々な物の使用状況を記録するように設定し状況はレポートで介護者に通知されます。レポートは日次や週次で通知パターンを選択できます。

システムが生活パターンを学習すると介護者は、対象が通常寝ている時間・起きる時間・毎日一定の活動がある時間、およびこの時間に使用される特定の機器について設定ができます。 介護者はその場にいなくても家電の使用状況を確認できるため、介護のストレスを軽減できています。

このシステムの課題として、

  • 高齢者がモニターを設置する許可を得ること
  • 24時間年中無休のモニターに対する抵抗を和らげる必要があること が挙げられています。

    さらなる活用のために介護者と介護される人の事前のコミュニケーションとセキュリティー面での安心が必要です。

スクリーンショット 2020-02-21 12.03.54.png

おわりに

1日の会議でこのような2つの実用的な事例が発表され、注目を浴びたことはAIの今後の活用において大きな進歩です。
それは企業がAIの専門家になって技術で解決する問題を見つけるのではなく、実際の課題を考え、それらを解決するためにAIを活用していることを示しています。 つまり技術ありきのAIから脱出し、課題解決の手段としてのAIとなり始めました。


当社でもAI・機械学習を活用した課題解決をご提案しております。

  • 自社にあるデータを2次活用したい
  • 画像データを活用した機械学習を作成したい
  • 既にAI・機械学習システムを利用しているが思うような効果が得られていない
  • 機械学習ではなにが出来るのか興味がある


このようなご相談は画面右上の[お問い合わせ]までご相談ください。


アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める


会社概要はこちら


Twitter・Facebookで定期的に情報発信しています!

SNS、口コミでの評価と顧客満足度は深い関係があります。
今回は「ネガポジ判定」を用いて、顧客の要望を発掘していきます。


目次

  • ネガポジ判定とは
  • 実装方法
  • 今後の検討方針
  • 参考文献


1.ネガポジ判定とは

自然言語処理分野に関する文章のネガポジ判定とは、AIが文章の内容がネガティブかポジティブか判定するものです。

今回は食べログからスクレイピングによって口コミ(お店の評価)を抽出し、それらを実際にネガポジ判定します。
判定結果、特にネガティブと判定されたものは、顧客満足度向上に役立ちます。この技術は、既存のデータを分析し二次活用していくために有効な手法です。


Sentiment Analysisライブラリ oseti

今回のネガポジ判定には oseti というライブラリを使用しました。
osetiは日本語評価極性辞書を用いて文の評価極性(ネガポジ)のスコアを計算します。このライブラリのリンクは参考文献に載せておきます。
例えば、以下の3つの文章でosetiを使います。


import oseti
analyzer = oseti.Analyzer()
analyzer.analyze('店員の態度は悪かった。')
==>[-1.0]
analyzer.analyze('ここのラーメンは美味しかった。')
==>[1.0]
analyzer.analyze('店員の態度は悪かったが、ここのラーメンは美味しかった。')
==>[0.0]


このように、osetiは極性を判定するキーワードに対しポジなら「+1」、ネガなら「-1」とスコアリングします。キーワードが複数ある場合はそれらのスコアの和の平均を出力します。また、osetiは1文ごとにスコアを出力し、文章を入力した場合は1文ごとにスコアを出していきます。


2.実装方法

事前準備【食べログから口コミのスクレイピング(抽出)】

では本題に入る前に、実際に食べログから口コミをある程度スクレイピングします。
スクレイピングする対象として、今回は東京都の渋谷(恵比寿,代官山含む)と池袋(早稲田,高田馬場含む)にあるラーメン屋を選択しました。

理由は、2つあります。
1.他の店舗間で値段の差がほぼないため、シンプルに味で口コミの評価が二分されると感じた
2.弊社が渋谷にあるのでどういうお店が評価が高いのか興味がある

そこで渋谷と池袋それぞれ、 評価が3.5以上のお店40件、それぞれの店舗から20件ずつ 計1600件(800×2)の口コミをスクレイピングしました。

スクレイピングの結果の一部です。

blog131_5-1.png blog131_6.png


scoreは食べログの評価、reviewcntはその店舗の口コミの件数で、著作権の関係上、店舗の名前storename、評価reviewは消してあります。このような形でそれぞれのデータをcsvファイルとして保存します。

さて、準備は整ったので早速osetiを使ってネガポジ判定していきましょう。


判定

まず、csvファイルのreviewに入っている文章を全てosetiに入力します。


 #ネガポジ判定
 def negaposi(text):
     review = analyzer.analyze(text)
     re_view= np.average(review)
     return re_view
 #ネガポジ判定値追加
 shibuya_ramen_review ['negaposi'] = shibuya_ramen_review['review'].map(negaposi)
 ikebukuro_ramen_review ['negaposi'] = shibuya_ramen_review['review'].map(negaposi)


出力は次のようになります。一番右のnegaposiの欄が判定スコアで、1文ずつのスコアの平均値を出しています。値が1に近ければよりポジティブであると考えられます。

blog131_7.png blog131_9.png


しかし、上の結果を見てみるとスコアは正の値となっていますが、極端に1に近いとは言えません。
例えば渋谷の1番上のスコア0.19444のレビューを見てみると(著作権の関係上載せれませんが)、スコア0.5は超えてもいいかなと思います。

文章全体を見てポジティブな内容であると分かっても、やはり文全体の平均を取っているので1に大きく近づきはしませんでした。なので、BERTなど文脈を読み取れるようなライブラリを用いた方が精度が上がりそうです。
全体としてポジティブに厳しい判定ではあったものの、ネガティブな内容をポジティブと誤判定することはなく、冒頭であげた「ネガティブな評価を見つける」、といった目的は達成できます。


N-gramによる頻出単語の可視化

次に、N-gramによってテキストを単語ごとに分割し、頻出単語を見ていきます。

blog131_10.png blog131_11.png blog131_12.png
今回ポジティブ判定されたラーメン屋の傾向が何となく分かります。

1、2、3の比較

  • 1では、麺などラーメン屋の口コミとしては当たり前に出てくる単語が上位に来てしまっているところは問題だが、味、麺、具材の種類を表す単語からは、池袋と渋谷を比較しても多少傾向が見られるので、ストップワードを工夫することで大まかな傾向は掴めそう。
  • 1は2、3と比べて一単語ずつの出現数が保証できる。
  • 2、3は1より具体的な麺、味の種類が出てくるため、より特徴的なワードを掴める。また、1よりも池袋、渋谷の差を確認しやすい。
  • しかし、一つ一つの出現数は少なくなるので、データの吟味が必要。
  • 2と3で入れ替わるワードもあり、両方のデータを考察する必要がある。


3.今後の検討方針

今回感情分析の手法(ライブラリ)としてosetiを用いましたが、単語の極性だけを見てもかなりの精度でネガポジ判定ができることがわかりました。

しかし、このosetiにはいくつか問題点があります。

  • 日本語評価極性辞書に載っていない単語が出現した際、それらを定量的に評価できない。
  • 極性辞書の単語の評価には作成者の感情が入っているので、客観的な評価が完璧にできない。
  • 1文ごとにネガポジ判定を行うので、文章全体で見たときに文脈を読み取れない。


これらが原因で、ポジティブな口コミをネガティブ寄りと誤判定したり、その逆の判定をしてしまう時もありました。
日々日本語は増えていくし、ニュアンスもそれに伴って変化していきます。人手で作る極性辞書にも限界があるので、今回はそこがボトルネックとなっていました。

3の問題点を改善するために、今後の検討ではBERTを用いて文章の感情分析を行いたいと思います。
また、単語の出現数だけを見て、ある程度の傾向は感覚的に掴めますが、単語同士の繋がりや、その単語がポジティブへ関係しているか明確ではありません。そのため係り受け解析をするなどが必要だと考えています。
全部の文章からだとその店に対する評価をしている文以外も入ってくるので、そこの取捨選択ができれば、評価されている部分と批判されている部分がより明確になると思っています。


4.参考文献

日本語評価極性辞書を利用したPython用Sentiment Analysisライブラリ oseti
【初学者向け】TFIDFについて簡単にまとめてみた


Twitter・Facebookで定期的に情報発信しています!

機械学習を利用して「エントリーシート自己PR分析サービス」を作成しました。

エントリーシートの評価や言いたいことが伝わるか、心配ですよね。
また、企業の採用担当者は膨大な数のエントリーシートを確認することはかなりの業務量かと思います。

「エントリーシート自己PR分析サービス」では、自己PRの内容を入力すると点数や頻出単語を表示します。


[2020年2月21日追記:デモ動画]

機能追加しました!
・自己PRそのものの採点ができるようになりました。


スクリーンショット 2020-01-23 11.53.29.png

サービスのポイント

  • 文章の特徴を可視化する
  • キーワードとの適合度を判定
  • 文章のカテゴリーを判定
  • 過去合格した自己PRと比較して採点


サービス内容を紹介します。


エントリーシート自己PRの例

私は、アルバイトの中で最も時給がアップしたという実績を持っています。

コンビニエンスストアで3年間勤務していますが、ただ働くのではなく、計画性を持って働くことができるという点が時給アップにつながりました。

具体的には、3つのポイントがあります。

お店の繁忙期をプライベートの予定と照合し、あらかじめお店が忙しい時にはいつでも残業できるようにしていたことです。一緒に働くスタッフの性格を把握しておき、一緒にシフトに入る人によって、自分の立ち位置を変えていたことです。集中力が必要となる発注作業がある日の前後には、徹夜するなどの無理なことはせず、身体的にも余裕をもっておくことです。

これら3つをすべて実行することで、他のスタッフは通常1度に30円しか昇給しないところ、前例のない100円の昇給に成功しました。

この計画性を活かし、御社でも先を見据えたスケジューリングと自己管理で、生産性の向上だけではなく、業務のクオリティをあげることにもつなげて参りたいと考えております。

(【例文多数掲載!】自己PRで計画性を伝えるときのポイントをご紹介から引用したものを少し修正)


ワードクラウド


wordcloud


結果を見ると「時給」や「計画」「アップ」などの頻度が高いことがわかります。
ワードクラウドとは与えられた文章を元に、出現頻度が高い単語ほど大きなサイズで表示するものです。文章内使われた単語を視覚的に捉えることで、エントリーシートなどの文章作成でも役立ちます。


キーワードと自己PRの適合度を判定

キーワード: 計画性 昇給
点数:77.7 点

キーワード:真面目 研究
点数:24.9 点

言いたいことを表現しているか採点するために文章内の頻出単語と自分で付けたキーワードを照合します。

就活において自分の強みなどを記述する際は、「計画性」や「行動力」、「部活」や「研究」などキーワードとなる言葉を意識して文章を組み立てますよね。これがどれぼど的確に出来ているかを採点するために、ワードクラウドの結果 (単語の頻度) とキーワードとなる単語との類似度を点数化しました。

例えば先程の自己PRでは、計画性やアルバイトに関するキーワードを選ぶと点数が高くなり、部活や協調性など関係のないキーワードを選ぶと低い点数になります。


単語の分散表現

キーワードとの適合度を判定するために単語の分散表現を用いました。
分散表現とは簡単に言うと単語を200次元などの高次元のベクトルで表現したものです。分散表現では似た単語同士は類似度が高く算出されます。

さらに、単語の意味も捉えることもできるため、
king - man + woman = queen
といった分散表現の足し引きをすることも可能です。
分散表現を使って、入力文章中の上位10個の頻出単語とキーワードを比べ、最大の類似度から点数を算出しています。
より適切に採点するために、類似度は文章中の出現頻度によって重み付けをしています。例えば、最も頻度が高い単語とキーワードの類似度は計算結果の値をそのまま使い、単語の頻度が1位の半分の場合は、類似度も計算結果の半分の値を使います。
キーワードも複数設定できるようにし、ユーザーの意図を汲み取りやすくしています。


自己PRを100点満点で点数化

自然言語処理において強力なBERTを使って自己PRを点数化しました。
ざっくりとしたBERTの解説については以下の記事をご参照ください。

Googleを理解する!文脈を読み取る最新の機械学習(BERT, ELMo)

自己PRを点数化する方針は良い自己PRを1とラベル付けし、悪い自己PRを0とラベル付けした後に2値分類を行います。2値分類の結果は0以上1以下の連続値で得られるので、その値に100をかけて点数化しました。

このときBERTをいちから学習させようと思うと大量のデータが必要になります。しかし、手元にあるデータ量は限られていたため事前に学習されたモデル(BERT日本語Pretrainedモデル)を利用しました。

最終的なモデルの構成は以下のようになりました。
BERTのEncoder-12-FeedForward-Norm層までを取り出しBidirectional層とDropout層を加えた後、全結合層を追加し2値分類できるモデルを作成しました。

BERT model structure


自己PRの点数化

上で例示した自己PRの点数を出してみましょう。

点数:84 点


次に悪い自己PRの例を用いて点数を出してみましょう。

エントリーシート自己PRの悪い例

私の強みは辛いことも諦めずに立ち向かう粘り強さです。わたしは大学の時にコンビニエンスストアでアルバイトをしていました。

コンビニでは担当する業務が思ったより多く、なかなかすべてを覚えることができなかったので、最初は店長やアルバイトの先輩に叱られてばかりでした。何度も辞めてしまいたいと思うことがありましたが、せっかく始めたからには諦めたくないという気持ちが強く、もっと前向きに仕事に取り組もうと考えました。

そこで、家に帰ってからもアルバイト先で学んだことをしっかり復習し、どの仕事も任せてもらえるような知識を身に付けました。また、気持ちよくお客様に接する事を心掛けて、どんなに疲れている時でも、どんなに忙しい時でも笑顔を絶やさないようにしてきました。今では店長や他のアルバイトの人にも認めてもらえるようになり、そのアルバイトを続けていくことができています。

これからもどんな仕事も諦めずに取り組む姿勢を大事にしたいです。

(自己PRの例文【悪い例:400文字、コンビニでのアルバイト①】から引用)

この自己PRはマイナスなことを書いている部分が多かったり、数字や具体的な内容が欠けておい良くない自己PRだと言えます。実際に点数を出すと

点数:52 点

冒頭の自己PRと比べて30点以上も低い点数となりました。

今回は良い自己PRと悪い自己PRの例をそれぞれ約50件ずつしか用意できなかったにも関わらず、2値分類のAccuracyでは75%以上の良い性能を出すことができました。やはり自然言語処理においてBERTは強力ですね。


まとめ

まだデータ量が少ないので精度にバラツキはありますが、大量のデータがあれば更に実用的なサービスになります。
現在はMicrosoft社などが提供するAPIを利用すれば機械学習を用いた様々なサービスを作ることが可能です。今後も多くのサービスがリリースされていくと予想されます。


Twitter・Facebookで定期的に情報発信しています!

車を運転していてヒヤッとした経験はありませんか?

疲れや睡眠不足からついうとうとしてしまい、急ブレーキ...。
起こってはならない事故ですが、死亡事故の4割程度を居眠り運転による事故が占めるそうです。1人で運転していると頼れるのは自分だけ。音楽やガムで気を紛らわせるのも限界があり不安ですよね。
本日はAI・機械学習を活用した、居眠りを検知する仕組みをご紹介します。


実際に使ってみました。うとうとして目が半目になるとアラートを出します。


このAIは動画のように、目が半目になると"Wake up !"と注意を促します。
今回はおこなっていませんが、よそ見時間が長いことで注意することや、音でより強い注意をすることもできます。



作成にあたり、Open CVとDlibというオープンソースのライブラリを活用しました。
Open CV Dlib
Open CVで顔そのものを認識し、Dlibで目の認識、また目が閉じそうな時の認識をしています。



AI・機械学習が身近になり、「こんなところにもAIが!」と気付くシーンが多くなってきていますね。
今後も身近な活用例をご紹介していきます。


Twitter・Facebookで定期的に情報発信しています!

消費者や企業によって発生する廃棄物の処理・管理が課題として挙げられることが増えています。

包装材の削減などで最終的に発生するゴミの量が削減されてはいますが、ゴミの発生は無くなることはなく今後も少なからず発生します。
廃棄物の処理・管理は主に手作業で実施されていて膨大な労力とコストが生じています。これらの課題解決のためにAIが活用され始めています。機械学習、ディープラーニング、コンピュータービジョンなどのテクノロジーで、廃棄物管理の効率と生産性向上のためのソリューションが登場しました。

「ゴミ発生段階 / 収集中 / 廃棄物処理プラント」の3段階に分けて海外サービスを紹介します。


SMART WASTE BIN

ゴミ箱でゴミを識別し、種類ごとに分類します。

SMART WASTE BINはBin.e社によって開発されたシステムで機械学習でゴミ分類のルールを学習し、ゴミ収集前のゴミ箱段階で分類をおこないます。ゴミが捨てられる時に全ての分別がなされので廃棄物処理センターで大量の廃棄物を選別する必要がなくなります。

さらにシステムはゴミ箱がいっぱいになったことも検知し、収集スケジュールを無駄のないように最適化します。事前に決まっているスケジュールで収集トラックを発送する代わりに、ゴミ箱がいっぱいになった場所のみを訪問するように収集ルートを最適化します。これにより、人手不足であった課題が解消され、収集速度が向上し、人件費・燃料費も削減されます。

WASTE


Waste & recycling sorting systems(廃棄物およびリサイクル選別システム)

廃棄場で分類し、適切なゴミ処理をします。

ゴミ収集後に廃棄場で人が分別するのではなく、機械学習を使用して分別ルールを学習し、ゴミの種類に基づいて廃棄物を識別および処理します。様々なタイプの廃棄物の画像を大量に学習させることで、システムは廃棄物の分類を理解し、特定の特徴に基づいて学習したカテゴリーとゴミを一致させます。
人の業務をシステムが代わり、今まで悩まされていた人手不足や見落としを解消し、少ないコストで同じ業務をおこなっています。

2018年のWaste Expo conferenceにも出展した、Machinex社はリサイクルすべきカートン、プラスチックボトルを見つけるためにAIを活用しています。Machinex社によると、このシステムは毎分最大70回ピックします。それは人間の2倍の業務量で、イリノイ州の大手リサイクル会社であるLakeshore Recycling Systems社は同社のSamurAIを設置し、2人分の作業をAIが実施し年間約130,000ドルの削減に成功したと発表しています。

WASTE


GAIN technology

上記のようにゴミは収集の時点で分別されることが理想です。
しかし、全てのゴミを分別し切ることは難しく、収集後のゴミをリサイクル時に分別するAIが開発されています。

TOMRA社は、2019年にGAIN technologyを発表しました。リサイクルする上で廃棄物の純度を確保するにはカートリッジからシリコンを分離する必要があります。GAIN technologyはコンピューターセンサーを使用してポリエチレンストリームからポリエチレンシリコンカートリッジを取り外します。
何千もの廃棄物タイプの画像が与えられ、ディープラーニングを利用し分類する方法を学習しました。そのため、さまざまな種類のシリコンカートリッジ、ダブルカートリッジ、さらには変形または部分的に破壊されたカートリッジを画像を分けて訓練することなく識別できます。
TOMRA社によるとGAIN technologyはカートリッジの99%の排出を達成しています。

WASTE


効率の改善と人件費の削減

課題としてあげた「廃棄物の処理・管理には膨大な労力とコストがかかっている」ことの背景には労働人口の減少が考えられます。今後はエネルギー不足も課題となってくると予想できるため、限られたエネルギーを最適化していく必要が更に高まると想定されます。

今回紹介したゴミ・廃棄物処理方法は発生段階、収集中、更には廃棄物処理プラント...と全ての段階でより効率的な改善策の提案をしています。
機械学習、ディープラーニング、およびコンピュータービジョンテクノロジーの活用により廃棄物の収集・管理を効率的に実施することができ、労働力の削減、様々な人にとって働きやすい環境の構築を実現しています。


Twitter・Facebookで定期的に情報発信しています!

日々AIに関する技術は発展していき、その中でも自然言語処理に関するトピックには目が離せません。
Apple社のSiri、AmazonのAlexaなど人間と会話できる(対話型)AIを通して、そういった技術が私たちの身近な存在になってきました。
そのような中、2020年1月末にGoogleが凄まじいAIチャットボット「Meena」を発表しました。今回はこのMeenaから今後のチャットボットの可能性について考えていこうと思います。


そもそもチャットボットとは?何ができるのか?

一般にチャットボットとは、「音声やテキストを分析し、自動的に会話を行うロボット」のことを指します。
先ほど述べたSiriは、iPhoneの普及に伴ってその知名度は爆発的に上昇しました。

「明日の天気は?」「朝8時にアラームをセットして」など、話しかけるだけで応答してくれるシステムは確かに便利です。

しかしこのような技術を商業的に用いるとなると、どういったことが考えられるでしょうか?

例えば、「顧客からのメールや電話対応にチャットボットを用いて業務の効率化を図る」ことが挙げられます。 顧客からのサービスや製品についての疑問というものは、Web上のFAQを読めば分かるような事も多いでしょう。

そういった簡単な質問に対してチャットボットを活用すれば、実際の社員はそれ以外のクレーム対応など重要な対応に専念できます。

今後のAIの普及と共に「AIができること」と「人間が行うべきこと」の棲み分けが重要になってきます。


Meenaとは?既存のチャットボットとの違いは?

では本題の「Meena」について見ていきましょう。

SiriやAlexaは一問一答形式の応答には特化しています。しかし実際に"自然な"会話をしようとすると、 AIが答えやすいように人間側がちょっとした調整をしないといけません。

しかし今回紹介する「Meena」ですが、ディープラーニングの技術を用いて人間と"自然な"会話を行うことができます。

GoogleはこのMeenaの能力を定量的に評価するため、SSA(Sensibleness and Specificity Average)[整合度と特異度の平均] という新しい評価尺度を導入しています。

SSAは自然な会話に必要な特性を評価するための指標で、(AIの)応答が文脈において意味をなすか、 そしてそれまでの話に対して特有なものであるか(限定的なものか)を計測します。

一般に前者は既存のチャットボットなら可能ですが、後者を達成するのは難しいとされていました。

つまり、「私はテニスが好きです。」という発話に対して「私もです。」という応答はどんな話題にも当てはまりますが、 「私もです。ロジャー・フェデラーにはなれないけども!」という応答は当てはまる場面が限られてきます。 こういった応答ができるのがこのMeenaというわけです。

Googleはクラウドワーカーを使ってMeenaとの会話のサンプルを生成し、約100の会話で発話を評価しました。 このSSAに対して、Meenaは以下の好成績を叩き出しています。

meena1.png

[✳︎Google AI Blog より引用]

Humansは人間、Mitsuku、Cleverbot、DialoGPT、Xiaoiceは既存のチャットボットを指します。
Mitsukuはチューリングテストコンテストで有名な ローブナー賞 を過去4度受賞するほどのチャットボットでしたが、Meenaはこれに圧倒的差を付け、人間のスコアにかなり近い値を出しています。


Meenaとの会話

実際にMeenaと人間が対話しているテキストがGithub上に上がっているのでそれらの1つを見てみましょう。

まず比較のためにMitsukuと人間の対話を見てみます。

meena2.png

29行目で人間側が「遅刻した」と言っているのに、Mitsukuはその後3回も「あなたは遅刻したの?」と聞き返しています。ちゃんとした会話が成り立っていません。

ではMeenaと人間の対話はどうでしょうか。

meena3.png

論文のトピック(題名)について人間側が迷っているようですが、それに対しMeenaは「水中での呼吸法」とそこそこ的確な返答ができています。


チャットボットの今後の可能性

Meenaについて、今回Googleは「整合度と特異度にのみフォーカスしたが、今後の課題として他の属性(個性や事実性)にも注視していく」と述べています。

他にも、Meenaに安全性があるか、バイアス(偏見)を持たないかといった倫理的側面がチェックされるまで一般向けに公開しないとしています。

数年前 Microsoftが発表したチャットボット「Tay」が人種差別発言をしたことはまだ記憶に新しいです。 こういった差別的発言をしないようなチャットボットができる未来が楽しみです。

MeenaのSSAのスコアの高さには正直驚きを隠せませんでした。AIが人間の会話レベルに到達するのはそう遠くない未来かもしれません。

コールセンターでは、顧客からの製品に関する簡単な質問に答えるチャットボットを導入している企業もあるそうですが、 近い将来はクレーム対応など難しいタスクもこなせるようになるかもしれません。今回のMeenaの発表は、今後の技術発展への期待が止まらないものでした。


チャットボットを用いて改善できる業務

人間と同レベルもしくはそれに近いレベルのチャットボットが誕生したら何ができるようになるでしょうか。

先程述べたことも含め、以下のようなことが考えられます。

  • サービスや製品に関するお客様の疑問は全てチャットボットで対応できる(現時点で一部をAIに任せている企業もある)
  • 音声による感情分析と合わせれば、クレーム処理など高度な対応もできるようになる
  • お客様との会話データを全て残せるため、それらのデータからお客様のニーズをキャッチできる


こういったメリットはたくさんありますが、チャットボットと人間の応答を比較した時、ちょっとしたニュアンスの違いや倫理観のズレが生じる時もあるでしょう。
特にAIが犯したミスに関して、その責任の所在が「AI」にあるのか「AIを作った人間」にあるのかという議論も出てきます。
倫理的側面も含め、こういった問題との向き合い方がこれからの課題となってくるでしょう。


参考文献

Towards a Human-like Open-Domain Chatbot
Towards a Conversational Agent that Can Chat About...Anything


Twitter・Facebookで定期的に情報発信しています!

こんなチャットボットを作りたい

仕事の休み時間に料理好きのメンバーからこんな話を聞きました。「なんでもいいが一番困る!!」
なんの話か分かりますでしょうか?この記事にたどり着いたあなたなら分かるはず・・・。


そう、「晩ご飯何でも良い問題」です!


この問題、調べてみるとかなり多くの主婦の方々が悩んでいて、夫婦喧嘩の原因の1つでもあるようです。

奥さんは、洗濯をしたり、毎日食事を考えてたりでやることがいっぱい。
対して旦那さんは、仕事で疲れ果てて食事を考える元気もない。

最近は共働きの夫婦も増えています。仕事だけでも大変なのに料理のことも考えるなんて「辛いな・・・。」と思う日もありますよね。

でも栄養をしっかり取るために料理はしたい・・・。
どうすればこの問題を解決できるでしょうか?


「自動で献立を決めてもらおう!!!」


そうすれば、「今日の晩ごはん何にしよう・・・。昨日は麻婆豆腐、一昨日は八宝菜・・・。」と毎日考える必要はありません。

こんな不安もありますよね。
「できれば買い物行きたくない・・・。」
「食べたくない気分の料理も紹介されたくない!」
このような気持ちも理解して、献立を紹介してもらえれば、毎日楽ちんです!


晩ご飯何でも良い問題を解決します。

こんなことができます。

  • 冷蔵庫にある食材からおすすめのレシピを紹介

  • 栄養バランス・調理時間も教えてくれる

  • 気分に合わせたレシピを紹介


お料理ボットってどうやって使うの?
①冷蔵庫の食材を入力する
②おすすめのレシピが表示される
③リンクをタッチしてレシピの詳細を確認


お料理ボットの流れはこれだけ!左側がAIが送るチャット、右側が私達が送るチャットです。

①冷蔵庫の食材を入力する
今回は「豚バラ」と「はくさい」を入力しましたが、「鶏肉」「ひき肉」「ほうれんそう」など何を入力しても大丈夫です。

ffbed1a0ae2ef04e379f43984f1fb0f8da66251f.png


②おすすめの料理が表示される
先程2つの食材を入力したところで、チャットボットがおすすめの料理を5つまで表示してくれます。
適当にレシピを表示しているのではなく、2つの食材を用いたレシピで人気トップ5を表示しています。

5ca426918a68f93f92e89916aa8846e65403456f.png


③リンクをタッチしてレシピの詳細を確認
料理名は青色の文字で表示されています。
これはリンクになっていて、タッチすると料理の詳細を確認できます。

79f57ed3b9c2859eb2b1fef7d66405332ec1e3f2.png 8a50fcc5262bd189db12f82acd1b893efe2df2b3.png


もっと活用したい

なんとなく雰囲気はつかめましたか?
お料理ボットは冷蔵庫の食材を入力するだけで、その食材を使った人気料理とレシピを紹介します。

今の実装段階では「作れる人気なレシピの紹介」はできても、栄養バランスやあなたの気分を考えたレシピの紹介はできていません。
「気分や昨日の食事の内容をチャットボットに入力すると、栄養バランスを考えた料理を紹介してくれる機能」を実装中です。


お料理ボットを使うとこんな風に生活が変わります。

今まで

あなた「今日の晩ごはん何が良い?」
相手 「うーん、なんでもいいよ。」
あなた(何でも良いが一番困る!!)


お料理ボットを使うと

あなた「今日はどんな気分?」
相手 「うーん、仕事で疲れちゃったな〜。」
あなた「お疲れ様。(お料理ボットに気分を入力)」
ボット「お疲れ様!今日は豚汁なんてどうかな?温かいスープと、お肉でエネルギー補給ができるよ!」
あなた「ありがとう!助かったよ!」


お料理ボットとこんな風に会話をしながら献立を決められれば、もっと楽しくお料理生活を楽しめるようになると思いませんか?


  • 冷蔵庫にある食材からおすすめのレシピを紹介

  • 栄養バランス・調理時間も教えてくれる

  • 気分に合わせたレシピを紹介


これらの機能の他にも、お料理ボットには便利な機能を追加することができます。
例えば、「赤ちゃんのための食事が知りたい」や「好きな飲食店はココ!」などと言えば、それに合ったレシピを紹介してくれるなどなど・・・。


お料理ボットは、あなたの悩み・願いに合わせて料理生活をさらに楽しいものにすることができます。

  • チャットボットについてもっと知りたい!

  • 料理でこんな悩みがある!

  • こういうことできないの?

等、是非ご相談ください!


献立のリンク先

https://www.kyounoryouri.jp/recipe/3293_%E3%81%98%E3%82%83%E3%81%8C%E3%83%81%E3%82%B2.html


Twitter・Facebookで定期的に情報発信しています!

第1弾、第2弾に続き



 今回は第1弾で取り上げたこちらを検討していく。

課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」への解決策

~発電量予測~
 


 ここでの「発電量予測」とは、発電装置周辺の気象・海象データを説明変数として発電量を予測することである。電力は常に需要量と供給量(発電量)が同量でなければ、停電を起こしてしまう。それを防ぐために発電量が予測されていれば、需要と供給のバランスを保ちやすくなる。また発電装置の無駄な待機時間も削減され、設備稼働率も向上する。このようにして、課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」を解決する。

 更に第二弾で紹介した「電力需要量予測による制御」と組み合わせれば、発電量と需要量をより正確に一致させることができる。

 今回は発電方法を洋上風力発電としてこの「発電量予測」を実装する。

news4049_pic1.png

図1 ドイツの洋上風力発電


目次

  1. データセットについて
  2. 予測モデルについて
  3. 精度の向上
  4. 結果・考察・課題
  5. 参考文献


1. データセットについて

 1章でも述べたが、発電量予測は発電装置周辺の気象・海象データを説明変数とすべきだ。しかし、風速や天候などの気象データ、波高や波向などの海象データ、そして発電量の三つ揃ったデータセットを手に入れるには、造波装置を搭載する大型水槽での模型試験、または実海域での実証試験を行うしかない。大規模な装置を使わずに単純なモデルで模型試験を行い、そこからデータセットを得ようというアイデアもあるが、それは一度おいておき、今回は表1のようなデータの種類を用いることにした。表2がデータセットであり、2016年1月1日0時0分から2017年12月31日23時45分までの二年分のデータ値が記入されている。

表1 データの種類
スクリーンショット 2020-01-29 14.19.11.png


表2 データセット
スクリーンショット 2020-01-29 14.50.50.png

 訓練データとして表1のデータを三つとも全て用い、テストデータは発電量を予測したいので、「DE wind offshore generation actual」とする。


2. 予測モデルについて

 2章のデータセットは時系列データなので、時系列の分析に強いLSTMをモデルとして採用した。

 LSTMとは、ディープラーニングの一種であるが、過去の情報をモデル内に保持していることが一番の特徴である。過去の情報といっても、少し前からの情報(短期記憶)や、かなり前からの情報(長期記憶)がある。LSTMはそのどちらも必要な分保持し続けるような仕組みになっている。

 重みの更新の方法はディープラーニングの一種なので誤差逆伝播法となるのだが、LSTMの場合、誤差が時間を遡って逆伝播することから、「通時的誤差逆伝播法BPTT(Backpropagation Through Time)」と呼ばれる。

 ところが、長い時系列に対してこれを行うと、勾配が不安定になったり、計算量が膨大になり、分析に時間がかかってしまう。そこで、連なったLSTM層の逆伝播のつながりだけを適当な長さ(「ブロック長さ」)で切断することで、この問題を解決することができる。このようなBPTTを「Truncated BPTT」と言い、この切断した一つの単位を「LSTMブロック」と呼ぶ。そして、そして全てのLSTMブロックを最初から最後までまとめたものを「Time LSTM層」と呼ぶ。

 今回は過去の「DE wind offshore generation actual」(発電量)のデータ値とその他の二つの特徴量から、1時間後の「DE wind offshore generation actual」(発電量)を予測するというモデルになっている。


3. 精度の向上

 予測精度を向上させるために下記を実施した。

  • 「Time LSTM層」を増やす
  • 「Time LSTM層」のユニット数を増やす
  • 活性化関数を変える
  • 「ブロック長さ」を変える
  • 最適化アルゴリズムであるAdamの学習率を変える


 この中で特に精度に差が出たのは、「「ブロック長さ」を変える」ことであった。ブロック長さを5、10、20、30と変えていくと、二乗平均平方根誤差RMSEは表3のようになる。この時、「Time LSTM層」は1つ、「Time LSTM層」のユニット数は20つとした。

表3 ブロック長さと誤差
スクリーンショット 2020-01-29 15.08.25.png

 また、図3、4はそれぞれ最も誤差の大きい、ブロック長さが5の時と、最も誤差が小さい、ブロック長さが10の時の実測値(real)(黒い破線)と予測値(predicted)(赤い実線)のグラフである。但し、発電量の値は0から1に正規化してある。図4の方が、黒い破線が赤い実線と重なり消えていて、予測が正しいということが分かる。

スクリーンショット 2020-01-29 15.15.07.png

図3 ブロック長さが5の時


スクリーンショット 2020-01-29 15.16.28.png

図4 ブロック長さが10の時

 また、「最適化アルゴリズムであるAdamの学習率を変える」ことも精度を変化させた。結果的に、学習率が0.0007の時に最も精度がよくなった。(図3、4は学習率0.0007の場合)


4. 結果・考察・課題

 図4はブロック長さを10、Adamの学習率を0.0007とした結果であるが、これは私が今回実装した中で最も精度の高い結果である。全体的にかなりの精度で予測できていることが分かり、時系列データに非常に強いLSTMをモデルとして採用していることが大きな要因である。

 しかし、発電量が非常に多い時(発電量を0から1に正規化した時の0.95以上)の予測精度は、今後、発電量予測を実用化する場合には必ず解決しなければならない問題である。当然であるが沢山発電することができる時というのは非常に重要であるからだ。このような結果を招く理由として考えられることは、これらが挙げられる。

  • 訓練データとして気象・海象データがない(特徴量が足りない)
  • 何らかのパラメータのチューニングで失敗している
  • 測定期間が短すぎる


私としては、パラメータのチューニングについては非常に多くのパターンを試してみたので、それによってこれ以上大きく変化するとは思えない。やはり訓練データとして気象・海象データがないことが一番の原因ではないかと考えている。自然の力を利用して発電しているのにも関わらず、自然の力に関するデータなしに、過去の発電量、容量上限、シェア率だけから発電量を予測しては精度は期待できないであろう。もし気象・海象データ(具体的には、風速、風向き、天候、波高、波向など)と発電量のデータセットを手に入れることができれば、実用化も遠くない予測モデルが完成するかもしれない。1章でも触れたが、大規模な装置を使わずに単純なモデルで模型試験を行って、そこからデータセットを得ることについても今後模索してみようと思っている。


5.参考文献

  • 斎藤康毅『ゼロから作るDeep Learning ② ー自然言語処理編』株式会社オライリージャパン, 2018


Twitter・Facebookで定期的に情報発信しています!

このような課題はありませんか

  • 不良品検査の人員不足で外注しており、コストがかかっている...【コスト削減】
  • ノウハウが引き継げずにベテラン検査員が退職し、検査に膨大な時間がかかっている...【人依存の解消】
  • 利益率向上・働きやすい環境のために生産性を上げたい...【生産性の向上】
  • 人によって判定にばらつきがあるため、品質にもばらつきが出てしまう...【品質向上】


どれも製造業のお客様からよく聞くお困り事ですし、改善には時間もお金もかかります。しかし、改善しないと品質低下を招き、お客様に不満を持たれてしまう可能性もあります。
これらのお困り事を機械学習で解決する、機械学習を活用した物体判定をご紹介をします。


画像を用いた物体判定の仕組み

画像認識の際には「画像のどこに何が写っているのか」を認識するためのモデルが必要です。機械学習を用いて学習データからこのような検出・判別するモデルを構築します。モデルをあらかじめ構築しておいて、認識する画像に対して判別結果を出力する仕組みを作ります。

モデルで実際に画像を判別する際には、画像の中から 特徴抽出する必要があります。画像の局所的な特徴の抽出や画像に含まれるノイズの除去などを、画像処理の手法や統計的な手法によっておこないます。判別に必要のない情報を除いた上で、判別結果を計算することができます。

抽出した特徴はいくつかの一定の大きさの領域にまとめた後、プーリング と呼ばれる処理でまとめられた領域を1つの値で代表します。画像の空間的な情報を削除し、判別に必要な情報のみを残します。

特徴抽出・プーリングの実施後には、事前に用意していたモデルによって画像を判別します。

また、ディープラーニングに代表される学習手法は特徴抽出・プーリングの処理をひとまとめにして、それらの手順をさらに繰り返すことで認識精度を高めています。


▼画像撮影から物体判定、振り分けまでのイメージ
画像を撮影しどこに物体があるか認識し、物体が何であるか判定し、判定内容によって振り分け(行動)します。
スクリーンショット 2020-01-29 15.05.29.png 1.カメラを設置し、動画で物があることを認識・検出します。(物体検出技術)


2.学習時に付けたラベルをもとに、検出した物が何であるか判定します。

学習は画像に対してラベル(正解)をつけておこないます。実際の運用では、カメラで検出した物体が学習画像のどれに近しいかと判定します。


3.判定結果により適切な行動をします。

機械学習の範囲からは出ますが、判定した内容をもとに次の指示を出します。例えば、ベルトコンベアー上のものがA製品であれば右に振り分け、B製品であれば左に振り分ける、または不良品であればアラートを出すことができます。


課題別 機械学習事例 コスト削減

点検作業の自動化
カメラで撮影した建物画像からひび割れ等の老朽化箇所を検出します。人からシステムに役割を変えることができ、人件費削減だけではなくかかる時間も短縮することができています。

倉庫内配置の適切化
倉庫内にカメラを配置し、撮影することで作業社の行動や物の位置を把握し分析します。倉庫内の動線や配置の最適化によって業務を効率化し、コスト削減を実現します。

特定箇所への農薬散布
企業が農業へ参入したことで、日本では集約農業から大規模農業へと転換が進んでいます。広大な農地で作物を育成する際に、ドローン等で空撮したデータから必要な箇所を割り出して、病害虫が発生している箇所ピンポイントに農薬を散布します。農薬使用量を削減できるだけでなく、他作物へのダメージを減らすことができます。


人依存の解消

受注量予測
過去の受注量のメカニズムからどれだけの発注があるか予測します。ベテランにしかできなかった発注業務の敷居を下げることで、限られた人しかできなかった業務を分配することができます。

野菜収穫の自動化
ノウハウが重要な収穫時の見極めをAIがおこないます。AIが判断した後にロボットに信号を送ると自動で収穫をおこなうマシンも検討できます。


生産性の向上

問合せへの自動応答
社内からの問合せ件数は日にかなりものです。その問合せをチャットボットで自動応答にすることができます。質問者も作文に時間をかけずに気軽に質問することができます。

居眠り検知
同じ作業が続く検品等で、うとうとしそうになってしまうことがあります。目の開きがあまくなるとアラートが鳴り、目を覚ましてくれるシステムも構築できます。


品質向上

高解像度画像の作成
最新のAI技術では荒く見づらい画像を高解像度に直すことができます。品質で失注していた案件に、より良い提案が出来る可能性が上がります。

コンベア内の品質チェック
コンベアを流れる物体が良品か不良品かを判定します。不良品可能性のある物は人が見るまでもなく振り分けることで、人の疲労による見落としを減らすことができます。


機械学習検討の作業プロセス

▼機械学習を検討する際のプロセスです。
スクリーンショット 2020-01-29 15.21.39.png

・事前検証

対象/判断の基準/期待する精度を基に適切な学習手法・アルゴリズムを設定します。


・システム開発

画像処理及び画像判定システムの検証・開発をおこないます。モデルへ画像と正解ラベルを合わせて学習させ、テストデータで事前検証で決めた精度が出せるようにチューニングします。


・テスト運用

運用に限りなく近いデータでトライアル運用をおこない、運用面や精度面での問題や課題を発見し対処します。


・リリース

テスト運用終了後に正式リリースとなります。必要に応じて、判定の精度向上のための再学習や活用範囲拡大のための追加学習を実施します。



当社は機械学習を活用したソリューションをご提案しています。

  • 自社にあるデータを2次活用したい
  • 画像データを活用したAIを作成したい
  • 既にAIシステムを利用しているが思うような効果が得られていない
  • 機械学習ではなにが出来るのか興味がある


このようなご相談は画面右上の[お問い合わせ]までご相談ください。


acceluniverse


Twitter・Facebookで定期的に情報発信しています!

こんにちは。
今回は「アイトラッキング」について紹介します!

皆さんは「アイトラッキング」という技術をどのくらいご存知でしょうか?
「アイトラッキング」とは、人間の視線の動きを追跡・分析する手法であり、視線推定技術とも呼ばれます。
この技術により、これまで調査者側からではわからなかった被調査者の無意識の「本音」がわかるようになりました。

この記事ではそんな素晴らしい技術、「アイトラッキング」がどんな場所、場面で使われているのかを調査し、その可能性について探っていきます。

目次

1 なぜアイトラッキング技術?
2 アイトラッキング技術の活用
 A マーケティング
  B 防犯・事故防止
  C ユーザーインターフェイス
  D スポーツ
  E 都市環境
  F 学術・医療
3 まとめ

1 なぜアイトラッキング技術なの?

被調査者の意見を知りたいと思った時、例えば消費者に何か意見を求める時、アンケートやインタビューをしています。
しかし、これらは個人の意識が無意識で入り込んでしまうため、結果が正確であるとは断言できません。
とっさに見栄を張ってしまったり、質問者に求められている答えをしてしまったり(つまりは忖度ですね笑)、選択肢の番号の流れに乗って選んでしまったり...ということはないでしょうか?

アイトラッキング技術は被調査者の無意識の自然な目の動きを追うので、個人の意識的な介入が少なく、本音を読み取ることができます。

人は生活の中で自然と目を動かします。そこから得られる情報は、どんなものに目をつけたのか、何に興味を持ったのかなど、その人に関する詳細なデータです。
アイトラッキング技術はそれらの膨大な情報を読み取ることができ、それを分析し活用することができれば様々な分野で有効活用できるというわけです。

2 アイトラッキング技術の活用

アイトラッキングの技術は主に「業務効率化」のために利用されます。
ここでは各分野のアイトラッキング技術の活用事例を紹介し、今後の可能性について探っていきます。

A マーケティング

アイトラッキング技術はその特徴からマーケティングに活用されることが多いようです。
ここでは、顧客の注意や興味を知るためにアイトラッキング技術が使われています。

  • 興味検知
    スーパーではたくさんの商品が棚に陳列されています。
    ある特定のものを買いたいとしましょう。
    皆さんは何を基準に買う商品を決めますか?値段、ブランド、それともパッケージでしょうか?

    アイトラッキング技術は、顧客が商品を決める時の目の動きに着目し、「誰が何に興味を示したか」だけでなく、一番初めに見た要素、一番長く見られた要素、頻繁に見られた要素、あまり見られなかった要素、また他の商品のどこと比較されたのかなどを明らかにします。商品を作るメーカーは、デザインを変えるのが良いか、だとしたらどんなデザインが良いか、値段は適正かなどを検討することができます。

    また、店で商品を買う時、POPをみて興味を持ち、ついつい買ってしまった、または目につくところにあったから買ってしまった、なんてことはありませんか?
    アイトラッキング技術を使うことで、効果的なPOP・広告作りや、効果的な売り場づくりを人の目の動きというデータに基づいて行うことができます。
    これを真剣に行えば、売り上げアップが期待できそうですね。
    買い物.png

B 防犯・事故防止

  • 不審者検知
    明らかに不審な動きをしている人を検知します。例えば、必要以上にキョロ  キョロして周りを気にしていたり、監視カメラを必要以上に注視していたり...という人を認識します。
    顔認証を組み合わせればホームセキュリティに応用できたり、動きまで認識できれば万引きなどの犯罪防止に役立つとでしょう。

  • 運転中の事故防止
    近年では危険運転防止のため、ドライビングレコーダーの利用が増えています。ドライビングレコーダーは車の外側を見るものですが、ここでは車の内側を見ます。

    運転者の視線を見ることで、運転中の意識喪失や居眠りの検知をしたり、運転中の脇見を検知することができます。これはもし事故が起こった時、過失なのか、故意なのか判定するのに役立ちます。
    また、視線や顔の動きから運転を採点し、アドバイスしてくれる機能があったら楽しいですし、一方で、緊張感・危機感を持って運転できるかもしれません。
    事故防止だけでなく、運転中の姿勢変化により発生する視線の動きを観察することで、疲れにくい車の開発にも活用されています。

  • 検査の見落とし防止
    何かを検査する時、人間での検査だとら何かの拍子に見落としてしまうことがあります。視線を感知することで防止することが出来ます。見落としが起こった時にも、視線を確認することで何が起こっているか分析でき、再発防止に繋がります。

    居眠り運転.png

C ユーザーインターフェイス

  • 操作パネルのデザイン検証
    現在、何かサービスを受けるとき電子機器で操作が多くなりましたね。(例えば、飲食店の券売機、案内や空港での航空券発見など)。ちょっと見づらいなとか操作しづらいな、など感じたことはありませんか。
    アイトラッキングの技術は、人の視線の動きやどこに長く注目しているか(興味を持っているかもしれないし、わかりにくくてずっと見ているのかもしれない)を読み取ることによって、消費者が電子機器端末を快適に使えるようにするためのきっかけを与えてくれます。例えば、効果的な電子メニューの配置や見せ方、視線の動きから好みを分析しリコメンド、デザインは適切かの検証などがあります。

D スポーツ

プロ選手とアマチュア選手の視線を認識し、何を見てどんな動きをしているか分析をすることで、良い動きを見極めるヒントになり、選手のレベルアップのために役立ちます。
他分野でも熟練技術者の技術の継承にも同じように役立てられます。
フィギュアスケートなどの一部のスポーツでは、演技の出来栄えを審判が決定します。アイトラッキング技術を用いることで、審判が何を見て、どんな基準で点数をつけているのかを明らかにし、より良い演技のために活用されている事例もあります。

E 都市環境

人々がより快適な生活を送るためにも役立てられています。
近年、日本の都市に訪れる、もしくは居住している外国人の方々が増加しています。彼らが国内を移動する際、きちんと地図を読めているのか、標識を認識しているのかなどを視線の動きから分析し、改善に役立てます。
また、避難訓練時に視線計測を行うことで、避難者にとって標識や案内が正しく、そしてわかりやすいものであるかを検証し、その結果をもとに改善をすることで効果的な標識のデザインや設置場所を検討することができます。室内でも避難誘導標識や消火器標識の設置位置が適切かどうかをあらかじめアイトラッキング 技術を用いて検証することで、非常時の被害を最小限に抑えることができます。

F 学術・医療

心理学や脳神経学において、人間の思考・言動における視覚情報の影響や、認知プロセスの究明に利用されています。また、医療の分野では眼球疾患や精神・神経疾患の研究にも利用され始めているようです。

3 まとめ

今回はアイトラッキング技術の活用事例とその可能性について紹介しました。この他にも、パソコンやゲームを視線だけで操作することもアイトラッキング技術を用いることでできるようになるようです。また、子供の学習時、どこをどのくらい見ているかを分析することで、優秀な子が何に着目するのかや、きちんと見るべきポイントを抑えられているのかを明らかにすることで、勉強時間からではわからない学習の詳細な部分が見えてくるでしょう。

ただ、アイトラッキングは技術にすぎません。得られたデータ、事実からその裏にあるもの(その行動の背景)について考えることが必要不可欠です。技術が進歩しても人間が考え、検証する必要があります。
アイトラッキング技術は今後ますます活用されていくでしょう。将来性があるので、今後ますます活用されていくのではないでしょうか。


Twitter・Facebookで定期的に情報発信しています!

業種別 機械学習導入・検討状況

2018年にIBMがおこなった調査によると、企業の82%はAIの導入を検討しており、金融サービス業界では既に16%の企業がAI システムを運用または最適化し、製造業がそれを追いかけるように導入・検討が進んでいます。

例えば、シーメンス、ジェネラルエレクトリック(GE)、ボッシュ、マイクロソフトなどの業界大手企業は、既に製造業のあらゆる部分を後押しするための機械学習アプローチによるAIの製造に多額の投資をおこなっているようです。

また、Google Trendsでも現在までの検索数の増加から、世の中の関心の高まりが伺えます。

スクリーンショット 2020-01-20 11.55.34.png

本記事では、製造業でのさらなるAI・機械学習活用のために3つの活用例をご紹介します。


製造業での機械学習活用例

メンテナンス時期予知

機器を使った製造行程がある場合、機器のメンテナンスが必須になりコストがかかることは避けられません。 また、製造行程において、想定外のダウンタイムは世界中の工場で起こっており、その約42%が機器の故障によるものだそうです。

そのため、メンテナンス時期の予測にAIを活用することが注目されています。 測定できる機器の状態データをAI・機械学習を使って、機器の状態を予測、推定します。メンテナンスが必要となるまでの機器の寿命が大幅に長くなります。 担当者は、機器があとどれくらいで交換/修理が必要になるか事前に知ることができ、またそのための対策を前もってとることが可能になります。


不良品検知

製造過程で発生する不良品はごく少数の割合でしか発生しませんが、不良品チェックは省くことの出来ない工程です。

そこで、人が目で確認している不良品のチェックを段階的にシステムがおこない、不良品可能性のあるものだけを人がチェックをするように役割分担をすることで、人の業務負担を軽減することが出来ます。

良品・不良品の画像等のデータを学習させ、不良品可能性の高いものにアラートを出します。不良品と断定するのではなく、あくまでも可能性とすることで、不良品の見逃しを防ぎます。


需要予測による市場適応

今後の需要を知ることで経営者はもちろん、現場担当者も適切に準備をすることで過不足なく対応することが出来ます。機会損失や過剰に在庫を抱えることを避けられます。

何をいつどのくらい受注したかの受注情報とその要因になるデータを学習させることで、未来の需要(受注)を予測します。

スクリーンショット 2020-01-20 13.16.20.png


今まで人がおこなってきた業務をシステムが代替することでこのようなメリットがあります。

AI・機械学習活用のメリット

  • 需要への調整
  • 運用コスト削減
  • 生産性向上
  • ダウンタイム削減
  • 商品力/競争力強化



AI・機械学習の浸透

今後も業種を問わずAIの活用は進み、とりわけ製造業での活用は急速に進んでいくと予想できます。


2019年12月に株式会社アイ・ティ・アールが以下のように調査報告しています。

2018年度のAI主要6市場の売上金額は199億5,000万円、前年度比53.5%増と大幅な伸びとなり、今後も継続的な伸びが見込まれることから、CAGR(2018~2023年度)は26.5%、2023年度には640億円に達すると予測している。 また、AI主要6市場の中で最も高い伸びを示したのが画像認識市場である。画像認識は工場などで行っている製品の外観検査や作業員の安全管理業務で導入が進んできたが、現在、道路や橋などの社会インフラ、各種建造物の保全業務での利用も急速に進んでいる。また、顔認証や車両の自動運転など、活用シーンの多様化により、今後も継続的な導入拡大が見込まれます。

上記報告から、AIはその技術進歩と相まって、私達の生活に浸透し始めていることがわかります。


当社も機械学習を活用したソリューションをご提案しています。
例えば、動画を用いた物体検出や、電力需要の予測が一例です。このような技術を用いて、お客様それぞれの課題解決へ取り組んでいます。

  • 自社にあるデータを活用したい
  • 自社に親しい業種の活用例を知りたい
  • AI・機械学習を活用したいが、方法に困っている
  • 機械学習ではなにが出来るのか興味がある


上記のようなご相談は画面右上の[お問い合わせ]までご相談ください。


当社、アクセルユニバースのご紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

  • ミッション(存在意義)
    私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

  • ビジョン(目標とする姿)
    社会生活を豊かにさせるサービスを提供する。

  • バリュー(行動規範)

    1. 変化を求め、変化を好み、変化する
    2. 自分の高みを目指してどんどん挑戦する
    3. お客様と一蓮托生でプロジェクトを進める



acceluniverse


Twitter・Facebookで定期的に情報発信しています!

リモートワーク・業務効率化を阻む紙

このようなことはありませんか?

  • お客様アンケートを手集計している。
  • 見積作成のために出社しないといけない。
  • 紙の伝票処理に時間がかかっている。


コロナウイルスの影響もあり、リモートワーク化が進む中、上司のハンコを貰うのでリモートワークできない。という声も少なからずあるようです。紙書類の作業のために出社をしなけばいけない...。リモートワークに限らず、営業が業務日報や見積り作成で会社に戻ることは業務効率を大きく下げる要因です。
2019年4月1日に改正された労働基準法では残業時間の上限が定められ、中小企業も2020年4月1日から規制の対象となりました。働き方関連法では有給休暇取得の義務化がはじまっており、少ない時間で現在の業務を遂行することの重要度がますます高まっています。


書類の電子化で期待できる効果

  • いつでも欲しい情報が引き出せ、編集できるのでリモートワークが促進する
  • 移動時間削減で業務時間が短縮
  • 現行の書類保管場所の省スペース化
  • 書類の内容をデータ化することで分析可能になり、二次活用できる
  • スムーズな情報の検索、共有で業務が効率化


書類データ化ソリューションの背景

MM総研が2019年7月30日に『AIを活用した手書き文字認識のAI-OCR(光学文字認識)サービスの利用実態』を調査しました。抽出した国内企業1000社のうち、9.6%の企業がAI-OCRを導入済みという結果が出ました。また、企業規模が大きいほど導入率が高く、1000人以上の大企業だけでみると13.2%が導入済みという結果です。
※AI OCRとは、手書きの書類や帳票を読み取りデータ化するOCRへ、AI技術を活用する新たなOCR処理をいいます。

スクリーンショット 2020-01-16 11.27.03.png
AI-OCRサービスの導入していない企業も、サービス利用への関心は高く、51.9%が「利用に関心がある」と回答しました。こちらも大企業を中心に関心が高く、1000人以上の大企業では導入済みを含めると72.7%がAI-OCRを利用することに関心があります。

業種別で見ると、卸売業・小売業や製造業、官公庁など、大量の手書き帳票が発生する業種でより強い導入意向がみられています。
また、導入企業のうち85.7%が「データ作成に要する時間を削減できた」と回答し、82.1%は「ミスの発生率」を、78.6%は「当該業務に必要な人員数」を改善できたと回答しています。


一方、AIを使わない既存技術のOCRは、全体の85.8%が「活用できていない」と回答しています。手書き文字やフォントの文字認識能力の低さが理由としてあげられており、調査では「手書き文字の識字率が低い」という回答が全体の41.6%、「フォントの識字率が低い」が31.8%という結果でした。
精度が求められる「文字の読み取り」にはAIは欠かせない存在となり始めています。

AIを活用した書類データ化の仕組み


スクリーンショット 2020-01-16 10.43.11.png
【文字認識】では文字の特徴を理解し、何の文字かAIが判定します。

文字の特徴を理解させるために、多くの画像をAIに学習させます。
「あ」であれば「中央に十字線がある」、「下に楕円がある」、「楕円は右で切れていて払いがある」のような特徴があり、新しく読み込んだ文字が「その特徴にどれだけ当てはまるか」でどの文字であるかを判定します。

文字ごとに判定していくとどうしても似た文字を誤判定してしまいます。
また書き癖の強い文字やつなげ字の判定は難しいとされています。


スクリーンショット 2020-01-16 10.43.51.png
そのため、【修正】では文字として判定した後に文章としても適切かチェックし、修正します。
そうすることでより高い精度で書類を認識することが可能です。


書類データ化活用シーン

大量の紙書類の存在はバックオフィス業務の生産性向上を妨げます。
帳票を種類毎に仕分け、記載内容の入力漏れや誤字脱字を確認し、あとは間違いに気をつけながらPCにデータを入力していく...。このような作業をシステムが代替する例を紹介します。


アンケートの集計

セミナー後や購入後にお客様にアンケートをとりますよね。
その場で回収することもあれば、後日郵送してもらうこと、様々ですが、お客様の声を反映させるためにスピード感が大切です。
また、見込みのお客様の場合はよりスピード感のある対応が必要となるので、手書きのアンケートでも即座にデータ化出来ることは初期対応を早めるために効果的です。


過去書類のデータ化

書類を探したいのに探せない...。重要な書類も倉庫の中やキャビネットに眠り、『書類探し』が業務になっていませんか?
過去書類をデータ化することで、検索性の向上による業務時間の短縮はもちろん、今までの保管場所をなくすこともできます。


営業メモの共有

敏腕営業マンが客先でどんな会話をし、売上を上げているか...。は永遠のテーマです。
そのノウハウを共有したいが、商談メモや勉強ノートを共有するのは難しく、経験と勘だよりの営業活動となるケースが多くあります。
メモやノートをデータ化することでノウハウの共有だけでなく、受注までのシナリオや商談の傾向を分析することで「勝ちパターン」を確立することができます。


テスト答案の読み取り

テスト答案を読み取り分析することで、問題に対する正解不正解以上に「どの問題はどう間違えるのか」を分析できます。
誤答率の高い問題がどのように間違えられたのかを知ることで「なぜ間違えたのか」を分析し、より効果的な教育をおこなうことができます。


申込書のデータ化

お客様からの申込書、事務所で転記していませんか?
転記作業の手間や誤入力も削減することが出来ます。大切なお客様データだからこそ、早く正確にデータ化をする管理をおすすめします。


まとめ

手書き書類をデータ化することで業務効率化を進めることはもちろん、たまったノウハウを共有したり、分析したり、有効活用できます。
ノウハウを共有することで新人の教育コストを削減するだけではありません。データを参照する仕組みを作れば「質問しにくさ」も解消でき、副次効果としてストレスやミスの軽減も見込めるでしょう。


当社ではみなさまの課題やお困り事を一緒に解決していきます。
問い合わせ口からご連絡ください。

  • 書類のデータ化が自社でも活用できるか知りたい
  • その他活用例を知りたい
  • 困っていることを相談したい
  • 機械学習・深層学習は他になにが出来るのか興味ある


アクセルユニバースのご紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。
例えば、現在人がおこなっている作業をシステムが代わることで、人はより生産性の高い業務に携わることができます。


acceluniverse


Twitter・Facebookで定期的に情報発信しています!

概要

AI技術の発展が進み、今や私たちの身の回りでも当たり前のようにAIが生活をより便利にしてくれています。この夢のような技術を支えているのは研究者の方たちによる地道な努力です。では、最近はどのような研究が行われているのでしょうか?

研究の成果は論文という形で公開されますが、世界中で活発に研究されているAI関連の論文は1日に数十~百本もの論文が出ています。そのためこれらの論文を読んで最新の研究動向をつかむことは難しいでしょう。

そこで今回はテキストマイニングと呼ばれる技術を用いて20年前から現在までに出版された大量の論文を自動で分析し、大まかでよいので、今流行っている研究や過去のトレンドを調べてみたいと思います。

目次

テキストマイニング

テキストマイニングって?

インターネットやSNSが発達し、個人が自分の考えを自由に発信できる今、膨大な量の文章データがネット上に集積していきます。こういった「生の」情報を集めることは簡単ですが、この中から本当に意味のある情報を引き出すことは容易ではありません。例えば数値データであるならば、平均値を求めたりすることで、大体の状況を把握することができますが、文章の場合にはこういった処理ができないからです。

テキスト(文章)マイニング(採掘)は、こういった問題に対処する一つの方法で、「膨大な文章の中から自分にとって価値のある情報を抽出する技術」のことです。最近よく見かける、ワードクラウド(下の図)もテキストマイニングを用いたものです。

wordcloud.png

一体どのような方法で文章から情報を抽出するのでしょうか?

それを見る前に、テキストマイニングの便利さを実感するために1つ例を考えてみます。
仮に洋服屋に勤務しているとして、売り上げがなかなか伸びなかったとします。あなたはその原因を探るべく、お客様アンケートを行いました。
従来の方法では

Q、品ぞろえに満足していますか?

  • 満足
  • 普通
  • 不満

のように選択式でないと定量的に扱うことができず、さらにセーターの品ぞろえが悪いのか、パーカーの品ぞろえが悪いのか、あるいはそれ以外なのか、区別がつきません。
これでは質問を作るのは手間だし、的確な情報も得ることは難しいです。

テキストマイニングを使えば、

Q、品ぞろえに関して不満な点はありますか?

のような自由記述で回答してもらい、これを分析にかけることで、「パーカー」「品ぞろえ」「悪い」といった大まかな回答の傾向をつかむことができ、適切な対処をとることができるでしょう。

このような利点からテキストマイニングは、SNSを対象にした商品のレビュー調査、新聞記事を対象にした社会学、対話型AI等、様々な用途に利用されいます。膨大なデータから何か新しい情報を抽出したい際にきっと強力な道具となるはずです。

分析方法

ここではテキストマイニングの流れについて説明したいと思います。あくまでテキストマイニングを利用した分析を述べることが主眼なので統計学的な詳細については省略します。
例として、2019年9月に環境活動家のグレタ・トゥンベリさんが国連で行ったスピーチの一部を見てみましょう。

This is all wrong. I shouldn't be up here. I should be back in school on the other side of the ocean. Yet you all come to us, young people, for hope? How dare you! You have stolen my dreams and my childhood with your empty words. And yet I'm one of the lucky ones. People are suffering. People are dying. Entire ecosystems are collapsing. We are in the beginning of a mass extinction. And all you can talk about is money and fairytales of eternal economic growth. How dare you!

このスピーチは環境問題に真剣に取り組まない各国の首脳らに向けた怒りのメッセージで、" How dare you! "「よくもそんなことができるものだ!」というフレーズが特徴的で話題を集めました。実際このフレーズは全スピーチ中で4回繰り返されています。

このスピーチ全文を分析にかけた場合には、ネガポジ分析(テキストマイニングを利用した分析の一つで、その文章全体がネガティブな内容なのか、ポジティブな内容なのかを判断する)では「ネガティブ」と判断され、よく出てくる単語として dareや, air (大気), fail (失敗する), solution (解決策), emission (排出)のような環境問題系の言葉が現れるはずです。また、語同士のつながりは、How, dare, you の3語のつながりが明確に出るはずです。

それでは分析の流れを順を追って説明していきます。(実際にはソフトの「実行」ボタン一つで完了します)

1、まず、文章を一文ごとに区切ります。英語の場合はピリオド(.)で区切ればよいのですが、 U.S.AMr. Tanaka のような例外もあるので、こういった例外を集めた一種の「辞書」が必要です。ソフトはこの「辞書」を参照しつつ全文を区切っていきます。今回用いるソフトウェアKH Coderではこの作業をPearlのモジュールを使って行っているようです。
例えば上のスピーチの一文

I shouldn't be up here.  私は今ここにいるべきじゃない 。

をとってきたとしましょう。

2、区切った一文を今度は単語ごとに区切ります。英語の場合スペースで区切ればよいです。ただし shouldn't = should not のような例外もあるので、これも「辞書」を参照しつつ行います。
上の例では

I, should, not, be, up, here

となります。

3,取り出した単語一つ一つについて、基本形に直します。過去形を現在形に直したり、複数形を単数形にしたりするということです。そうすることで carscar 等の二種類の単語を一つにまとめて扱うことができ、分析が楽になるからです。この作業をステミング(stemming)と呼びます。これにも「辞書」が必要です。英語の場合には "Stanford POS Tagger"、 "FreeLing"、 "SnowBall" といった辞書が公開されています。今回は2、および3の作業には "Standard POS Tagger"を用います。
この作業を行うと上の例では

I, shell, not, be, up, here

となります。

4,次に stop word を削除します。これは英語の場合 be動詞や前置詞など、どんな文章にも頻繁に現れる、重要ではない語のことです。何をstop word とするかは分析者が自分で定義します。
上の例では

not, here

のようになるかもしれませんし、何も残らないかもしれません。

5,ここまでの作業はどのテキストマイニングのソフトにも共通の前処理でした。ここからどのように分析を行っていくのかがそのソフトの特徴となります。分析の方向性には以下のように大きく二つあります。

  • 分析者があらかじめ指定した単語を中心にコンピュータが分析する手法
    • 例えば地球温暖化についての新聞記事を対象としている際に、分析者が「火力発電」という切り口で分析を進めたい場合、コンピューターは指定された「火力発電」を含む文章を集め、多変量解析の手法で分析します。(単語の出現回数を数えたり、一緒に現れやすい単語の組を探したりします)
    • 分析者の問題意識が反映されやすい一方で、客観性に問題があるかもしれません。

  • 分析者が何の条件も指定せず、バイアスなしでコンピュータが分析する手法
    • 初めから全データをコンピュータが多変量解析の手法で分析し、得られた結果から何が言えるのかを考えます。
    • 上の例だと、地球温暖化に関する記事を全て分析にかけ、その中で「火力発電」がどのくらいのウエイトを占めているのかなどを調べます。
    • 結果があいまいになる(ほかのデータの中に埋もれやすい)恐れがある一方で客観性は保証されます。

今回用いるKH Coderはどちらのアプローチでも分析できるのが特徴です。

実際に後者の方法で上のスピーチ全文についての分析を行い、「共起ネットワーク」(語の出現回数を丸の大きさで表し、語同士のつながりを線の太さで表した図)を描いたものが次の図です。

example.png

中心付近で、 How, dare, youの3語が強く結びついているのが分かります。ただ、頻出の単語は come, people, say 等、環境問題特有のものではなく、一般的に多くの文章でよく使う単語が目立ちます。このスピーチは短いのでまだマシですが、大量の文章を分析するとこの傾向がさらに強まると考えられます。そのため、こういった単語はstop wordにしてしまうか、あるいは表示する単語の出現回数に上限を設けるなどの対策が必要です。


データの収集

arXiv

論文の収集には、物理、数学、情報科学といった分野の論文が保存・公開されている、arXivというサイトを使います。arXivは時間のかかる査読(提出した論文を他の専門家がチェックする過程)を経ずに論文を無料で投稿できるため、多くの論文が集積しています。今回は分野を機械学習分野に絞り、論文の最初に書かれている、Summary(要約)を集めて分析したいと思います。Summaryは短いので大量の論文から集めても計算時間がそれほど長くはならず、また論文全体の内容が凝縮されているので、機械学習に関係のない単語の割合が少なく、分析しやすいと考えたからです。

スクレイピング

大量の論文を集めるにはスクレイピングという手法を用います。いちいち自分で該当するwebサイトにアクセスせずに、自動でダウンロードしてくれる便利な方法です。arXivはスクレイピング用のAPIを用意してくれているのでこれを利用します。今回は2019年、2018年、2017年、2016年、~2009年、~1999年に出版された論文を集めます。

※以下のコードは Google Colaboratory で動作確認済みです。

まずは必要なライブラリをインポートします。

import arxiv
import pandas as pd

※ arxivが入っていない場合は、次のように打ってインストールしてください。

! pip install arxiv


このarxivというAPIを使えば、検索条件を指定するだけで自動で論文名、著者、日付、要約などをダウンロードできます。
今回は、「機械学習分野(LG)で2019年に出版されたもののうち、最大10,000件を提出日の新しい順に」取得します。それが以下のコードです。

latestQuery = arxiv.query(query='cs.LG AND submittedDate:[20190101 TO 20191231]', max_results=10000, sort_by='submittedDate', sort_order='descending')

得られるデータは辞書形式で見にくいのでデータフレーム形式(エクセルのような表形式)に直します。

df_latest = pd.io.json.json_normalize(latestQuery)
print(df_latest)

以下のような表が得られます。

スクリーンショット 2019-12-27 17.49.22.png

ここから Summary(要約)だけ取り出します。

df_latest_s = df_latest[['summary']]
df_latest_s.index.name='index' #後でつかうソフトに合わせるためのもので特に意味はありません。 

最後に、得られたデータを同じディレクトリにcsvファイルとして保存します。

df_latest_s.to_csv('./latest_data.csv')

全く同様に、2018年、2017年...の論文を集めます。

# 検索条件を指定
oneoldQuery = arxiv.query(query='cs.LG AND submittedDate:[20180101 TO 20181231]', max_results=10000, sort_by='submittedDate', sort_order='descending')
twooldQuery = arxiv.query(query='cs.LG AND submittedDate:[20170101 TO 20171231]', max_results=10000, sort_by='submittedDate', sort_order='descending')
throldQuery = arxiv.query(query='cs.LG AND submittedDate:[20160101 TO 20161231]', max_results=10000, sort_by='submittedDate', sort_order='descending')
tenoldQuery = arxiv.query(query='cs.LG AND submittedDate:[20000101 TO 20091231]', max_results=10000, sort_by='submittedDate', sort_order='descending')
tweoldQuery = arxiv.query(query='cs.LG AND submittedDate:[19900101 TO 19991231]', max_results=10000, sort_by='submittedDate', sort_order='descending')

# データフレーム型に変換
df_oneold = pd.io.json.json_normalize(oneoldQuery)
df_twoold = pd.io.json.json_normalize(twooldQuery)
df_throld = pd.io.json.json_normalize(throldQuery)
df_tenold = pd.io.json.json_normalize(tenoldQuery)
df_tweold = pd.io.json.json_normalize(tweoldQuery)

# Summaryだけ抜き取る
df_oneold_s = df_oneold[['summary']]
df_oneold_s.index.name='index'
df_twoold_s = df_twoold[['summary']]
df_twoold_s.index.name='index'
df_throld_s = df_throld[['summary']]
df_throld_s.index.name='index'
df_tenold_s = df_tenold[['summary']]
df_tenold_s.index.name='index'
df_tweold_s = df_tweold[['summary']]
df_tweold_s.index.name='index'

# csvファイルに保存
df_oneold_s.to_csv('./oneold_data.csv')
df_twoold_s.to_csv('./twoold_data.csv')
df_throld_s.to_csv('./throld_data.csv')
df_tenold_s.to_csv('./tenold_data.csv')
df_tweold_s.to_csv('./tweold_data.csv')

これでデータの準備は整いました。なお2009年、1999年に出版された論文は少なすぎたので、前10年分をとりました。

分析

今回テキストマイニングに用いるソフトはKH Coderです。これは日本人の方が開発されたソフトで、英語だけでなく日本語や中国語にも対応しています。

KH Coderのインストール

ここからダウンロードできます。Windowsの場合はダウンロードしたファイルを実行するだけですが、MacやLinuxの場合、MySQLやPearl、Rの設定などを自分で行わなければいけないので環境構築が大変です(インストールを自動化してくれる有償サポートもあります)。基本的には このサイト に従えばよいですが、それでもエラーが頻発すると思います(私はいやというほどしました)。どうしても解決しない場合は、製作者の方が質問を受け付けてくださっているので ここで質問してみるのも手です。

私が詰まったエラーを二つ書いておきます。

・MySQLの「LOAD DATA LOCAL INFILE」コマンドでエラー

err2.png

↓エラーメッセージ

SQL Input:
LOAD DATA LOCAL INFILE '/Applications/khcoder-master/config/khc26/khc26_ch.txt' INTO TABLE rowdata CHARACTER SET utf8mb4
Error:
The used command is not allowed with this MySQL version
```

これはKH Coderの開発時からMySQLのバージョンが新しくなったことによる問題です。まずターミナルで

mysql -uroot

と打ってMySQLにログインします。その状態で次のようにコマンドを打てば解決するはずです。

SET PERSIST local_infile= 1;

・MySQLの「GROUP BY」でエラー

error1.png

↓エラーメッセージ

SQL Input:
INSERT INTO hgh2 (genkei, sum, h_id, h_name)
SELECT hgh.genkei, SUM(num), hinshi.id, hinshi.name
FROM hgh, hinshi
WHERE hgh.hinshi=hinshi.name
GROUP BY hgh.genkei, hgh.hinshi

Error:
Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'khc25.hinshi.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
```

これも 開発時からMySQLのバージョンが更新されたことによる問題です。MySQLにログインした状態で以下のコマンドを打てば解決します。

mysql> set global sql_mode=(selectreplace(@@sql_mode,'only_full_group_by',''));

KH Coderの設定

上述したように、文章から単語を取り出して基本形に直すには「辞書」が必要です。また、stop wordの削除を行うには、自分でstop wordを定義しなければいけません。

まず、今回使う辞書 "Standard POS Tagger" をダウンロードして適当な場所に保存しましょう。ここからダウンロードします。
KH Coder のメニューバーから、【プロジェクト】→【設定】→【語を抽出する方法】→【Standard POS Tagger】→【*. TAGGER file path】に先ほど保存した場所を指定します。また、同時に【Stop words】も定義します。KH Coderをダウンロードしたときに一緒にダウンロードされる、sample fileをそのままコピペすればよいでしょう。

また、【その他】の「前処理効率化のためにデータをRAMに読み出すを選択しておくと前処理が早くなるのでチェックしておくと良いです。

前処理の実行

設定が終われば、【プロジェクト】→【新規】から先ほどスクレイピングで集めたファイルを指定します。「分析対象とする列」にはindexではなく、 **summaryを指定** するようにしましょう。また「言語」は英語、Standard POS Tagger となっていることも確認しましょう。

次に前処理をします。メニューバーから【前処理】→【前処理の実行】を押し、現れるダイアログは「OK」を選択し、しばらく待ちます(私の場合1~10分ほどでした。)
初めのうちはここで山ほどエラーが出ると思いますが一つ一つつぶしていきましょう。

結果

結果の表示にはその分析法に応じて複数の描画の方法があります。「対応分析」と「共起ネットワーク」が視覚的にわかりやすいので今回はこれを使いました。他にも多くの方法があるので詳しくはKH Coderのマニュアルを参照しましょう。マニュアルは、メニューバーから【ヘルプ】→【マニュアル】で見ることができます。

まずは、古い順に共起ネットワークを描いていきます。共起ネットワークは、語の出現回数を丸の大きさで表し、語同士のつながりを線で表しています。また、語の色分けについては、「サブグラフ検出」と呼ばれる方法で比較的強くお互いに結びついている部分を自動で検出してグループ分けを行った結果です。ただし、マニュアルにも書かれている通り、

あくまで機械的な処理の結果であるから,色分けには必ず重要な意味があるはずだと考えて深読みをするのではなく,グラフを解釈する際の
補助として利用することが穏当であろう

とのことなので注意します。
語同士のつながりには実線と破線がありますが、同じサブグラフに属する語同士は実線、そうでなければ破線という意味です。

まずは一番古い1990 - 1999年まで(実際にあったのは1997/12 - 1999/12)に出た全論文33本について分析を行ったのが以下の図です。

twenty.png

algorithmという単語が最もよく出てきていることからもわかるように、この時期は基礎的な研究が主だったことがうかがえます。
reinforcement, agent, maxq, corpus, natural, language 等の単語から、強化学習や自然言語処理の研究がすでに始まっていたこともわかります。


続いて2000 - 2009年にかけて出版された全論文762本について分析したのが以下の図です。

ten.png

依然 algorithm が最頻出単語です。 vector - machine はいわゆる SVM(サポートベクターマシン)、 decision - tree は決定木、 classification = 分類、など今につながる具体的な手法が目につきます。 time - algorithm や、 model - learning のつながりが現れたことから、機械学習の原理の研究から、現実的な問題解決の方法論へと研究が移行していったのがこの時期だと考えられます。


続いて2016年に出版された全論文3568本について分析した結果が以下です。

throld_100-1500.png

上述のように機械学習に関係のない語をはじくために、出現回数が100回以上1500回以下の単語に絞って書いてあります。この対処法は感覚的なもので、これが最も適切な処理である根拠はありません。実際機械学習の中心的な単語であるはずの algorithm model が出てきていないのは出現回数が大きすぎたためです。これがテキスト分析の難しいところですが、これ以上ソフトで分析を進めるのは難しいので、あとは注意深く結果を見て、何かしらの傾向をつかめるように頑張ります。

左にある緑色の大きなグループは、 task を中心として image, classification, dataset, frameworkのような単語が並んでいることから、画像分類の内容であると推測できます。ディープラーニングによって画像分類の精度が飛躍的に高まり、話題を集めたのが2012年のことなので、これは比較的新しい話題で、研究のフロンティアだったのだと考えられます。
右の方には reinforcementを中心にした強化学習、下の方には wordを中心にした自然言語処理が20年前から依然としてあり、この二分野は長らく、よく研究されていることが言えます。
上の方には optimization(最適化), gradient(勾配)などのやや基礎的な研究内容があります。
また、教師なし学習の代表格 clusteringも目につきます。


続いて2017年に出版された52381本の論文について。

twoold_200-1000.png

出現回数が200回以上1000回以下の単語に絞った描画です。
この年に特徴的なのは、reinforcementを中心とする強化学習に関連する単語群の出現数がほかの分野に比べて相対的にずっと多くなったことです。前年のグラフと比べてみれば一目瞭然です。
この時期に強化学習関連で目立ったことがあったのかどうか調べてみると...ありました!
2016年3月に GoogleのAlphaGoが韓国のトップ棋士李世乭さんに5番勝負で4勝1敗にて勝利し、2017年5月には中国のトップ棋士柯潔さんにも3局全勝を上げていました。ニュースでも大々的に取り上げられましたね。

将棋やチェスなど数あるボードゲームの中でも、囲碁はそのありうる盤面の数が際立って大きいです。そのためコンピュータの得意とする全探索手法が使えないために、人間に勝利することは難しいと考えられていたために、AIに詳しい人ほど、この対局は衝撃的だったのでしょう。これを機に研究者たちの中でも強化学習の可能性に注目が集まり、よく研究されるようになったのだと推測されます。

左上の方には RNN, LSTM, GAN といったディープラーニングに関する話題が多く出てきています。以前にもあったけれども、ほかの語に埋もれていたのかもしれないので、この時期にはやったのかどうかは何とも言えません。

左の方には language, textなどの自然言語処理の話題があり、前年に比べ相対的に大きくなっています。また、 speechが新たに自然言語処理に加わっているのも面白いですね。


続いて2018年に出版されたもののうち5600本(「うち」と書いているのは、APIの仕様のせいか、全ての論文を集めることができなかったためです)。

oneold_200-1000.png

出現回数が200回以上1000回以下の単語に絞った描画です。
下の方にある optimization, gradientはアルゴリズムの研究のような基礎的な話題でしょう。
左の方にある青い大きなグループは layerがハブになっていて、また雑多な単語がつながっていることからディープニューラルネットワークを用いた応用的な話題かと思われます。
上の方にあるオレンジ色のグループは強化学習、右の方にある紫色のグループは自然言語処理の話題でしょう。

最後に2019年に出版されたもののうち3000本です。

latest_200-1000.png

出現回数が200回以上1000回以下の単語に絞った描画です。
アルゴリズム(赤)、強化学習(青)、自然言語処理(オレンジ)、画像認識(黄緑)など、今よく聞く話題がよく研究されていることがわかります。また、突出して出現頻度が多い語はなく、色分けされたグループもだいたい同じ規模です。これが出現回数の制限によるものかどうか調べるため、試しに2000回以下、及び制限なしの場合に同じ図を描いたのが次の図です。

latest_2000.png

latest_max.png

やはり同じ傾向が見られます。このことから、現在の研究は、アルゴリズム、強化学習、自然言語処理、画像認識がどれも活発に研究されていると言えるでしょう。


これまで出版年ごとに共起ネットワークを出してきました。各年ごとの特徴はよく分かるのですが、時間変化はわかりにくくなっています。
時間変化をメインに共起ネットワークを描くには、すべての論文データを出版年とSummaryだけ残して一つのCSVファイルに統合し、これを前処理します。そして共起ネットワークを描く際のオプションとして、「共起パターンの変化を探る(相関)」にチェックを入れます。こうすると、以下の図が得られます。

change_100_1000-5000.png

この図は、赤い線ほど、最近出版された論文に特徴的なつながり、青い線ほど古い論文に特徴的な論文に特徴的なつながりを表します。例えば、下の方にある rewardは古い論文では regretとよくつながっていましたが新しい論文では reinforcementとよくつながっているようです。これは強化学習における rewardに対する考え方が変化したことを表している可能性があります。
他にも、右の方にある languageは、よく共起する単語が wordから textへと変化していることもわかります。これは自然言語処理の発展により、研究対象が wordから textへと移り変わったことを示していると推測することもできます。

共起ネットワーク以外の表現方法もあります。以下の図は対応分析と呼ばれる手法を用いて分析した結果です。

unified_taiou.png

この図では出版年が書いてある赤四角の領域に近い言葉ほど、その年に特徴的な言葉であることを意味します。
例えば2018年と2019年の四角は領域がほとんどかぶっていて、出てくる主要な語に変化が少なかったことを意味します。ただ、出てきている語を見ると、 CNN, reinforcementのような機械学習の具体的な手法や分野を表す語がなく、抽象的な語ばかりなので、ここからトレンドの変化を探ることはできませんでした。描く対象になる語の出現回数を制限するなど、パラメータを適切な値にできればそういったことが可能であったかもしれません。


参考文献


Twitter・Facebookで定期的に情報発信しています!

今回は「じゃらんの口コミをスクレイピングしてみた」ということで紹介していきます。
※この記事はスクレイピング初心者向けに書いています。

目次

 1はじめに
 2スクレイピング
 3可視化
 4分析・まとめ
 5注意すること
 6終わりに

はじめに

 皆さんは今年の冬をどのように過ごす予定でしょうか?
 今回は「冬」「雪」といえば「スキー」「温泉」ということで、この二つのキーワードに関連するホテル・旅館の口コミを分析しました。LINEトラベルのサイトによると、温泉が楽しめるスキー場1位は「山形蔵王温泉スキー場」のようです。
 このエリアの口コミ評価今現在第一位のホテルについてスクレイピングさせていただきました。

 今回は特定のホテルの口コミをスクレイピングし、どんな人が口コミを投稿し、どんな評価をつけているのかをグラフを表示しながら分析しました。

スクレイピング

 今回取得する情報

 ・性別
 ・年齢
 ・評価
 ・いつ宿泊したか
 ・誰と旅行したか
 ・価格帯

 この記事は初心者向けに書いていますので、コードを初めから紹介したいと思います。
 ここではスクレイピングからデータフレームを作るところまでを紹介しています。
 
 まずはじめに必要なものをインポートします。

 
from bs4 import BeautifulSoup import urllib
import pandas as pd 
import requests

 

取得したいホテル口コミページのURLを取得します。

html = requests.get('https://www.jalan.net/yad309590/kuchikomi/')
soup = BeautifulSoup(html.content,'html.parser')

このホテルの口コミページは3ページあったので、それぞれのURLをリストに入れておきます。

 url_list = ['https://www.jalan.net/yad309590/kuchikomi/?screenId=UWW3701&idx=0&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
'https://www.jalan.net/yad309590/kuchikomi/2.HTML?screenId=UWW3701&idx=30&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
'https://www.jalan.net/yad309590/kuchikomi/3.HTML?screenId=UWW3701&idx=60&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01']

ここから本題に入っていきます。
まず、口コミ投稿者の性別と年代を取得し、綺麗な形にします。

valuer = []
    for row in url_list:
row = str(row) html = urllib.request.urlopen(row) soup = BeautifulSoup(html) valuer.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__user__name')) continue valuer_list = valuer[0]+valuer[1]+valuer[2] new_valuer_list = [] for row in valuer_list: row = str(row) new_valuer_list.append(row.split('(')1.split(')')0)

このようになります。


スクリーンショット 2019-12-27 15.22.27.png

性別・年代をそれぞれデータフレームに入れます。


data = pd.DataFrame()
sex = []  
age = []  
for row in new_valuer_list:
  row = str(row)
  sex.append(row.split(' / ')[0])
  age.append(row.split(' / ')[1])
 new_age = []
 for row in age:
   row = str(row)
   new_age.append(row.replace("代","'s")) 
 data['sex'] = sex
 data['age'] = new_age

スクリーンショット 2019-12-27 15.33.04.png

次に、口コミ評価を取得します。


value = []
for row in url_list:
    row = str(row)
    html = urllib.request.urlopen(row)
    soup = BeautifulSoup(html)
    value.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__rating__em'))
    continue
value = value[0]+value[1]+value[2]
new_value = []
for row in value:
    row = str(row)
    new_value.append(row.split('')[1].split('')[0])
data['value'] = new_value

最後に、いつ・誰と・どのくらいの価格帯で利用したのか取得します。


what = []
 for row in url_list:
 row = str(row)
 html = urllib.request.urlopen(row)
 soup = BeautifulSoup(html)
 what.append(soup.find_all("div", class_='jlnpc-kuchikomi__cassette__attribute1 styleguide-scope'))
 continue
 
 what = what0+what1+what2
 
 new_what = []
 for row in what:
 row = str(row)
 new_what.append(row.split('')1.split('')0)
 
 date = []
 trip = []
 for row in new_what:
 row = str(row)
 date.append(row.split('【')1.split('宿泊')0)
 trip.append(row.split('\xa0\xa0')1.split('】')0)
 
 data['date'] = date
 data['trip'] = trip

 price = []
 for row in what:
 row = str(row)
  price.append(row.split('【宿泊価格帯】')1.split('(大人1人あたり/税込)')0)

 data['price'] = price

データフレームが完成しました。


スクリーンショット 2019-12-27 15.52.35.png

可視化

ここでは先ほどスクレイピングした口コミ投稿者のデータについて可視化し、簡単に考察します。
まずはじめに、取得したデータについて簡単に見ていきましょう。


性別

スクリーンショット 2019-12-27 16.09.00.png

年代


スクリーンショット 2019-12-27 16.18.32.png

口コミ評価


スクリーンショット 2019-12-27 16.27.10.png

いつ利用したか


スクリーンショット 2019-12-27 16.30.44.png

誰と利用したか


スクリーンショット 2019-12-27 16.34.27.png

価格帯


スクリーンショット 2019-12-27 17.35.14.png

分析・まとめ

データからわかること
・口コミ投稿者は50代が一番多く、60代、40代と続く。
若い層(20代、30代)よりも多いのは、お金に余裕があるからなのか、あるいは温泉地ということが関係しているのか。
  ・今回「スキー」と「温泉」というキーワードで探したが、2019年8月の投稿が多い。夏でも人気のある観光地なのかもしれない。
・大人1人あたり1万円を超え、高いものは3万円を超えるものもあることがわかる。夫婦旅行が多いことにも関係していそう。


 

仮説:蔵王には、お金に比較的余裕があり、子育ても終わった50代の夫婦が旅行に来ることが多いのでしょうか。8月に口コミが多かったのも、冬に体力の必要なスキーを楽しむのではなく、ゆったりと自然を感じたいという人が多いのかもしれません。もしかすると、今回、「スキー」「温泉」で蔵王が出てきたのは、スキーで有名という理由だけではなく、体力のある若い世代に冬の時期に多く来て欲しいという地域の狙いがあるのかもしれません。


今回取得した口コミの数は74件と少なく、取得したデータの種類も少ないため、事実に対して理由を断定することはできません。しかし、だからこそ上記の仮説のように想像を膨らませ、いろいろなことに思いを巡らせることができるのかもしれませんね。


注意すること

口コミを分析する際にはいくつか気をつけなければいけないことがあります。
・口コミ分析は、宿泊者全員について分析できるというわけではなく、あくまで「口コミをした人」のみに対する分析となります。もしかしたら、男性よりも女性の方が口コミをするのが好きかもしれないし、年齢層が高めの人より若い人の方が口コミを投稿するということもあり得ます(その逆も然り)。
 口コミを分析している時点で情報を限定してしまっているということに気をつける必要があります。
・上と似ているのですが、口コミを投稿する人はどんな人かを考える必要があります。
 口コミを通して伝えたい!という人はどんな人でしょうか?宿泊にとても満足してお礼を伝えたい、良さを伝えたいという人や、何か不満があって意見を言いたい、改善策を伝えたいという人が想定されます(不満だった人は関わりたくないから口コミを投稿しないということも考えられます)。可もなく不可もなく感じている人は、口コミ投稿するのが好きという人を除き、わざわざ口コミを投稿するでしょうか?
・口コミは利用した人の感想ですから、主観が入り、その情報が正確かを確かめることは難しいでしょう。もしかしたら嘘をついている人や誇張して書いている人、あるいはサクラがいるという可能性も0ではありません。完全ではないということを意識する必要があります。
・今回は、口コミ評価が高評価に著しく偏っているため、どんな人が高評価・低評価をするのか明らかにすることはできませんでした。「口コミ評価が高評価に著しく偏っている」のは、このホテルに限ることなのか、もしくはエリア全体、口コミ全体でそういう傾向があるのかを明らかにすると、今後の口コミ分析の役に立つかもしれません。

終わりに

今回は特定のホテルの口コミをスクレイピングし、投稿者についての分析を行いました。
 次回は、今回のスクレイピングの手法を活かして、どこかの「エリア」のホテル・旅館についてスクレイピングし、そのホテル・旅館ごとの傾向や、どんな人がそのホテル・旅館に向いているかなどを考察していこうと思います。
 後々、機械学習を用いて、旅行しようと思っている人に最適なホテルをオススメできる機能を作りたいと考えています。



Twitter・Facebookで定期的に情報発信しています!

最近、機械学習のビジネスへの活用がさかんになっています。
その中でこういったお困り事はありませんか?

  • トップダウンで「機械学習を導入してほしい」と言われたけど何から始めればいいか分からない
  • 機械学習の導入を検討したけど計画で頓挫した
  • 社内に機械学習の導入を提案したいが、提案がまとまらない


本記事ではそんな方向けに機械学習の検討ステップと導入効果をご紹介します。


機械学習の検討ステップ

Process

1.AI・機械学習で出来ることを知る
2.対象の業務・目的を決める
3.学習データを用意する
4.モデルを開発する
5.評価をする
6.運用する


もちろんお客様ごとに異なりますが、概ねこのような流れで検討〜導入することが多いです。
次に各検討ステップの詳細をご紹介します。


機械学習で出来ること

機械学習はこれらのことを得意としています。
スクリーンショット 2019-12-26 16.36.30.png


いくつかサービスの具体例を挙げてみます。

チャットボット

お客様や社内の問い合わせへチャットボットが回答します。
業務効率化だけではなく、お客様をお待たせしない仕組みを作ることができます。

不良品検知

製造過程での不良品をシステムが発見します。
人がおこなっていた長時間の業務をシステムが代替し、人はさらに生産性の高い業務に当たることができます。

手書き帳票処理

手書きの書類を読み取り、データ化します。
コストのかかっている人力での転記作業をシステムがおこないコストを削減し、紙の紛失リスクを低減します。

食べごろ野菜検知

収穫前の野菜にカメラをかざすと、食べごろの野菜に反応します。
人依存作業による、収穫時の人手不足を解消します。

離職危険性アラート

アンケート結果と部署異動等の変化等の現職者の状況から、離職可能性を可視化します。
早期に退職希望者やストレスを感じている人に気付き、フォローをおこなえます。

価格査定

過去の査定情報から、『もし、いま、これを売るとしたらいくら?』と査定します。
売り手への意思決定の補助、早期の情報提供ができます。


対象の業務と目的を決める

ずばり、AIを導入してどんな業務で何をしたいのかです。

「それを考えるのに困ってるんだよ〜。」

ってお思いですよね...。ただ、ここが定まらないとAI(機械)も困ってしまいます。 なぜなら、課題と指標の設定は人間にしかできません。

  • 上記に挙げた活用例の使えそうな業務を見つける
  • 困っていること(課題)に対して、解決の方法を見つける

の2パターンでどんな業務で何をするのかを決めていきます。


その後は、ゴール(目標)の設定が必要です。


問い合わせ業務の効率化のためにチャットボットの検討をしたとします。
現状、ありがたいことにお客様の問い合わせが多く、対応が追いついていません。
業務が膨大になるだけではなく、このままではお客様に迷惑をかけてしまいかねません。
ーーーーーーー...

この時に考えられるゴールは複数ありますよね。
問い合わせ業務にかかっている時間を◯%削減する、誰でも問い合わせ業務をできるようにして一人あたりの負担を軽減する、お客様満足度を向上させる...。

このゴールによって、AIでおこなうことや学習させるデータ、出力するものが変わってきます。
そのため、まずは活用例を参考に解決したい課題と対象業務を設定することが必要です。


学習させるデータを用意する

機械学習はその名の通り、機械に学習させて、結果を出力させます。

どんなに優秀な人でも、学習(勉強した答え)を誤ると正しい答えを導けません。
また、学習時間を多く取れば、正解の精度も上がりますが、同じ学習だけを長い時間し続けてしまうと、幅広い問題には対応できません。


機械も同じです。


そのため、目的に応じて正しいデータをたくさん学習させる必要があります。


導入効果

それではAI・機械学習の導入効果についてご紹介します。
これらが実現できます。

  • 業務効率化
  • コスト削減
  • 顧客満足度向上
  • リスク管理
  • 社内環境改善


機械学習は大量のデータを活用/同じ作業を早くくり返す/過去から未来を予測することが得意です。


そのため、 書類の転記作業や同じような問い合わせへの対応等、定期的に人手でおこなっている作業をシステムが代わることで、業務効率化をしコストの削減に繋がります。
そうすることで昨今叫ばれている生産性の向上の手助けにもなるでしょう。

作業時間が短縮することで、お客様対応へより多くの時間を充てることができます。接客はもちろんですが、お客様に喜ばれる企画をする時間も増えるということです。
お客様に充てる時間だけではなく、社内向けの時間も同様です。後回しになりがちなより働きやすい環境へ整備する時間を確保することができます。


おわりに

機械学習 検討ステップと導入効果をお伝えできたでしょうか。

当社のバリュー(行動規範)のひとつに『お客様と一蓮托生でプロジェクトを進める』を掲げています。
みなさまの検討へも早期段階からお手伝いいたします。

スクリーンショット 2019-12-26 19.16.02.png

機械学習は幅広い活用方法があり、お客様ごとの活用方法が必要です。
当社ではみなさまの課題やお困り事を一緒に解決していきます。
下記にご興味がありましたら、問い合わせ口からご連絡ください。

  • 機械学習の導入を考えている
  • 活用事例についてもっと詳しく知りたい
  • 他になにが出来るのか興味がある


当社、アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。
例えば、現在人がおこなっている作業をシステムが代わることで、人はより生産性の高い業務に携わることができます。


acceluniverse


Twitter・Facebookで定期的に情報発信しています!

最近は今までに増して機械学習を検討する企業が増えています。 しかし、導入検討にあたり、機械学習でなにを改善するのか/なにを解決するのかという、導入目的を決めあぐねているケースも多いと耳にします。

本記事では機械学習はどのような業種で、どんな目的で導入されようとしているのかを紹介し、機械学習の活用例と解決できる課題(導入効果)をお伝えします。

『こんな使い方が自社に役立つな』や『機械学習でこんなことをやりたい』を発見してもらえると嬉しいです。

検討段階のシフト

2018年にIBMがおこなった調査によると、企業の82%はAIの導入を検討しています。
また、AIの運用と最適化を開始している企業は、2016年と比較すると、33%増加しています。導入に向けて成果を上げている企業は概念検証のテストや実験の域を超えて進んでいます。

経営層の目の向く先は、

『機械学習を導入すべきか』
から
『どのようにして機械学習を導入するか』
へと移行しているようです。

機械学習は技術的な進歩がめざましいと紹介されていますが、それに沿うようにして機械学習への期待も膨らんでいます。

機械学習の導入・活用実績

機械学習の導入率はテジタル化が進んでいる業界で高く、そのスピードも今後上がっていくと見込まれます。

例えば金融サービス業界では既に16%の企業が 機械学習システムを運用または最適化し、次いで製造業が追いかけています。

しかし自動車やヘルスケア業界にもこの傾向は見られており、機械学習は今後も大きな期待をされていることがわかります。

機械学習に期待すること

情報技術 (IT) と情報セキュリティー (IS)が、最も優先すべき業務として挙げられています。

例えば 機械学習を利用したヘルプデスク仮想アシスタント、 プロセス自動化、脅威検知アルゴリズムの活用があります。
その他に、イノベーション、顧客サービス、リスクの領域があります。
イノベーション領域には戦略的な機会が不可欠ですし、顧客サービスの領域は多くの企業が仮想アシスタント機能を試験的に導入しています。 そしてリスクの領域では不正の防止と検知が重要です。

幅広い領域で機械学習は活用できますが、効果的な導入にするためにはどの領域で/何を達成するのかという設定が必須です。

コスト削減より、顧客満足度を重視

企業として売上増加はこの 2 年間で一層重視されるようになりました。

調査によると、経営層は顧客満足度と顧客維持率をAI投資の主な目標に掲げており、これはコストに対する考慮を大きく上回りました。
もちろんこれはコストが重要ではないという意味ではあり ません。

多くの 機械学習プロジェクトの中を見てみると、目的のひとつにはやはりコスト削減の要素が含まれているので、『コスト削減は当然で、次の視点として顧客満足度を重視している』とも言えます。
また、運用コストの削減も 3 番目に重要なものとされています。しかし、このランキングでの順位をを押し上げたのは最高財務責任者 (CFO) と財務部門かもしれません。

加えて、多くの企業は製品やサービス よりも顧客体験を重視しています。
何を売るかよりも、その製品やサービスを通じてどんな体験ができるか、ということです。体験は購入後だけではなく、購入前の検討時もその対象です。 

顧客体験の向上は、顧客に対面するその企業の担当者次第であることが少なくありませんが、
そのような場面で AIを的確に利用した仮想アシスタントを使用すれば、既存の専門知識を拡大して、顧客の質問により速く、正確に、しかも経済的に答えられるようになります。

機械学習活用例

ここまで、機械学習が活用されている業種と目的をお伝えしました。
次に業種ごとにお客様満足に繋がる機械学習の活用例をご紹介します。

製造業

『製造ラインでの不良品検知』


課題
食品製造ラインで不良品は手作業で弾いている。

  • 個人ごとに判断がばらつく場合がある
  • 同じ体勢で長時間いるため作業者への負荷が大きい


導入後
製造ラインにカメラを設置し、良品/不良品を自動で仕分けする。

  • 作業者は別の業務にあたることができ、より利益追求や改善が進んだ。
  • 生産性の向上も実現し、労働時間を短縮できた。


飲食業

『顧客の消費予測で廃棄、機会損失の減少』


課題
いつ、どれくらい売れるかを肌で感じ、仕入れをしている。

  • 店長のスキルで売上、利益が大きく異なる。
  • 仕入れを絞ると機会損失が生じ、仕入れを増やすと廃棄が多くなる。


導入後
過去の売上から未来の売上を予測する。

  • 廃棄や機会損失の減少
  • 常に欲しい物が適切量ある店舗で、顧客満足度も向上


小売業

『チャットボットでユーザー好みの商品をオススメ』


課題
ECサイトでの売上が伸び悩んでいる。

  • 試着ができないため、ユーザーは意思決定できない。
  • 電話での個別問い合わせはハードルが高く、利用されない。


導入後
ユーザーが質問に答えると似合う商品が分かるチャットボットを利用。

  • 廃棄や機会損失の減少
  • 常に欲しい物が適切量ある店舗で、顧客満足度の向上


『SNSから商品評価分析』


課題
商品のリアルな評価が不透明で新商品開発で悩んでいる。

  • どのようなシーンで、誰が商品が使われているか知りたい。
  • 口コミサイトや直接の評価は極端なものが多い。


導入後
SNSから自社商品が写っている写真を分析する。

  • 利用されている季節や雰囲気が分かり、より顧客に寄り添った商品開発が出来る。


おわりに

機械学習は幅広い活用方法があり、お客様ごとの活用方法の提案が必要です。
運用までこのような流れで進めることが多いです。
Process


アクセルユニバースではみなさまの課題やお困り事を一緒に解決していきます。
下記にご興味がありましたら、問い合わせ口からご連絡ください。

  • 活用事例についてもっと詳しく知りたい
  • 機械学習・深層学習は他になにが出来るのか興味がある


アクセルユニバースのご紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。
例えば、現在人がおこなっている作業をシステムが代わることで、人はより生産性の高い業務に携わることができます。


acceluniverse


Twitter・Facebookで定期的に情報発信しています!

〜普及に向けた課題と解決策〜に続き

 私が前回作成した記事である「海洋エネルギー × 機械学習 〜普及に向けた課題と解決策〜」では、海洋エネルギー発電の長所と課題とその解決策について触れた。今回はそこで取り上げた、

課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」への解決策

~発電量・電力需要量予測~ ~機械学習を用いた制御~

を実装してみる。

 繰り返しにはなるが、この「発電量・電力需要量予測」と「機械学習を用いた制御」とは、まずカレンダー条件(時間帯、曜日など)と気温や日射強度などの気象条件を説明変数として電力需要量を予測し、電力需要量の送電にかかる時間分先の予測値と同量を発電するように発電装置を制御するという、極めて単純な制御である。前提として、電力は常に需要量と供給量(発電量)が同量でなければ、停電を起こしてしまうのであるが、この制御を行えば、需要と供給のバランスを常に保ちながら発電することができる。また発電装置の無駄な待機時間も削減され、設備稼働率も向上する。このようにして、課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」を解決するのである。今回は発電方法を波力発電としてこれを実装する。


目次

  1. 今回の実装の設定
  2. 機械学習による電力需要量の予測
  3. 並進動揺型の波力発電装置の運動制御
  4. 考察
  5. 参考文献


1. 今回の実装の設定

1-1. どんな波力発電装置で実装するか

 まず波力発電装置の種類は表1、図1のように分類できる。

表1 波力発電装置の種類

スクリーンショット 2019-12-26 12.44.18.png スクリーンショット 2019-12-26 14.54.18.png

 図1波力発電装置の種類


 今回の実装では、垂直(上下)にのみ変位する並進動揺型の波力発電装置を考える。並進運動型の波力発電装置の特徴は、

  • 波に対する指向性がなく、他の発電装置に対して波向きの影響の点から優位である
  • 構造がシンプルで発電機構(PTO: power take off)も含め大部分が水中に没しているので、浮体本体の構造安全性や信頼性の点で有利である
  • 波浪荷重、発電荷重を下端で支えているため繰り返しの係留力が作用することになり、下部の構造強度に配慮する必要性がある
  • 発電装置が水面より下側にあることから、上部からの浸水に対しては十分注意が必要

 また、現在最も実用化に近いものと見られる波力発電装置は、米国のOcean Power Technologies社が開発した並進動揺型の波力発電装置「PowerBuoy」(図2)である。 スクリーンショット 2019-12-26 14.54.47.png

図2Ocean Power Technologies社の「PowerBuoy」


1-2. 実装の設定

 今回の設定は、1機の上下揺のみする並進動揺型の波力発電装置から、ある海沿いの一軒家に直接電力を供給するという状況を考える。波力発電装置から一軒家への送電時間は10分かかるとする。つまり上記の制御をこの波力発電装置に行うには、現在(時刻\(t\))の発電量\(P(t)\)が10分後(\(\tau=10~[分]\))の電力需要量の予測値\(P_{ML}(t+\tau)\)と等しくなる必要がある。


2. 機械学習による電力需要量の予測

 ある一軒家の電力需要量(電力使用量)を予測する時、本来ならば上記に示したようにカレンダー条件と気象条件を説明変数とするべきだが、カレンダー条件と気象条件、電力消費量のデータセットを手に入れることができなかったので、今回は特徴量を表3のようにしたデータセット(表4)を用いる。これは2016年1月11日17時00分から2016年5月11日16時50分までのデータセットである。

表3 データセットの特徴量

スクリーンショット 2019-12-26 16.11.02.png


表4 データセットの一部

スクリーンショット 2019-12-26 15.03.37.png


 初めに示しておくが、電力需要量は暑い夏や寒い冬など季節によって変動する。であるから正確に予測するためには少なくとも1年以上のデータ数が必要となるが今回はデータ数が1年に満たない。なので当然予測精度は悪くなると考えられるが、今回は実装手順を紹介したいので、精度については目を瞑る。
 予測モデルは時系列データに強いと言われているLSTMを用いた。すると予測結果は図3のようになる。破線はデータ値で、赤線が予測値である。但し値は0から1になるように正規化されているため、正規化された赤線の値を元に戻した値が\(P_{ML}(t+\tau)\)である。図3を見て分かるように電力需要量が多い時の予測値は実際の値とかなりずれているが、それは想定内で、それ以外の時は良く予測されている。この予測値を波力発電装置の制御に用いる。

スクリーンショット 2019-12-26 13.41.48.png

図3 予測結果


3. 並進動揺型の波力発電装置の制御

 まず、波浪中を自由に動揺する浮体(水面に浮く物体の総称)の問題は船舶流体力学の知識から、以下の二つの問題に分別することができる。

表5 波浪中を自由に動揺する浮体の問題の分類

スクリーンショット 2019-12-26 14.49.14.png


 ディフラクション問題において浮体に働く力には以下のようなものがある。但し、重力と浮力は釣り合っているとして除外する。

表6 ディフラクション問題において浮体に働く力

スクリーンショット 2019-12-26 14.49.41.png


 ラディエイション問題において浮体に働く力には以下のようなものがある。

表7 ラディエイション問題において浮体に働く力

スクリーンショット 2019-12-26 14.50.02.png


 当然ではあるが上下揺のみする並進動揺型の波力発電装置も浮体の一つであるから、ここでは浮体と呼ぶことにする。
 まず浮体の動揺を制御していない場合、波浪中の浮体の運動方程式は、浮体の上下方向の運動変位を\(z\)、上記で示したラディエイション力、復原力、波浪強制力の上下方向成分をそれぞれ\(F_{3}^{R}(\ddot{z},\dot{z})\)、\(F_{3}^{S}(\ddot{z},\dot{z})\)、\(F_{3}^{W}(\ddot{z},\dot{z})\)とすると、 \[ m\ddot{z}(t)=F_{3}^{R}(\ddot{z},\dot{z})+F_{3}^{S}(z)+F_{3}^{W}(t)\tag{1} \] と表せる。ここで\(F_{3}^{R}(\ddot{z},\dot{z})\)、\(F_{3}^{S}(z)\)、\(F_{3}^{W}(t)\)は数値計算または計測されていて既知であるとする。
 次に浮体の動揺を制御する場合、浮体の運動方程式は式に制御力\(G_{3}(t)\)を加えて、 \[ m\ddot{z}(t)=F_{3}^{R}(\ddot{z},\dot{z})+F_{3}^{S}(z)+F_{3}^{W}(t)+G_{3}(t)\tag{2} \] と表せる。この制御力\(G_{3}(t)\)を調節することで、望んでいる量を発電するように浮体を動揺させることができる。
 発電量\(P(t)~[W]\)は、発電機構の巻線抵抗\(R_{s}~[\Omega]\)、推力係数\(K_{t}~[N/A]\)を用いると、機械入力\(-G_{3}(t)\dot{z}(t)\)から発電ロス\(\cfrac{ R_{s} }{ K_{t}^{2} }G_{3}^{2}(t)\)の差として表せるので、 \[ P(t)=-G_{3}(t)\dot{z}(t)-\cfrac{ R_{s} }{ K_{t}^{2} }G_{3}^{2}(t)\tag{3} \] となる。
 この発電量\(P(t)\)を、機械学習(machine learning)で予測した時刻\(t+\tau\)の電力需要量\(P_{ML}(t+\tau)\)となるように制御したいので、 \[ P(t)=P_{ML}(t+\tau)\tag{4} \] とする。すると式\((3)\)は\(G_{3}(t)\)の二次方程式 \[ \cfrac{ R_{s} }{ K_{t}^{2} }G_{3}^{2}(t)+\dot{z}(t)G_{3}(t)+P_{ML}(t+\tau)=0\tag{5} \] となる。二次方程式の解の公式より、制御力\(G_{3}(t)\)は \[ G_{3}(t)=G_{3}(\dot{z})=\frac{ -\dot{z}(t)\pm\sqrt{ \dot{z}^2(t)-4\cfrac{ R_{s} }{ K_{t}^{2} }P_{ML}(t+\tau) } }{ 2\cfrac{ R_{s} }{ K_{t}^{2} }}\tag{6} \] と求まり、浮体の上下揺の速度\(\dot{z}\)の関数となる。この制御力\(G_{3}(\dot{z})\)を式\((2)\)に代入することで、浮体の動揺は\(P_{ML}(t+\tau)\)だけ発電するように制御される。


4. 考察

 上記で示したように制御することで、確かに需要と供給のバランスを常に保ちながら発電することができる。ただ、今回は実装の手順を示すことを目的として電力需要量の予測の精度については気にしなかったが、本来はここが極めて重要である。2章でも示したが、今回使用したデータは1年に満たないデータ数である。これでは電力需要量の朝、昼、夜の変化は捉えることができたとしても、季節の変化は捉えることができない。これが予測精度を落としている明らかな理由である。
 また、今回は10分間で送電が完了するという状況を考えたためそう遠くない未来の電力需要量を予測するだけであったが、実際波力発電装置が陸地からかなり遠い沖合に設置された場合、10分で送電できるとは考えられない。つまりもっと先の未来の電力需要量を予測できなければならない。実際に今回のデータセットで1時間先の電力需要量を予測してみたところ、かなり酷い精度になり、これでは波力発電装置の制御には使えないという結果となった。しかしこの原因もデータ数が足りないことであることは分かっている。季節の影響を捉えていないモデルで、未来を上手く予測できないのは当然である。
 上記二つの問題はデータ数を増やすことで改善できるので、長い期間の電力需要量のデータを入手次第、改めてやり直そうと考えている。
 問題はまだある。それは発電量が多い時、精度が悪くなることである。これは今のところ原因が分かっていないので、引き続き研究していく。
 また、今回は求めている発電量を発電できるような制御を行ったが、安全性については全く考慮していない。たとえ電力需要量と同量発電できたとしても、事故を起こしてしまっては元も子もない。なので、今回の制御に安全性の配慮を加えた研究も今後行っていく。


5.参考文献


Twitter・Facebookで定期的に情報発信しています!

本記事では以下のような使い方ができるチャットボットを紹介します。
スクリーンショット 2019-12-24 16.53.21.png


2019年に施行された働き方改革関連法により、残業時間の削減や多様な働き方が認められました。
今後も多くの人にとって働きやすい環境に変化し、さらに多様な働き方になることが予想されます。
そのため、現在は『業務時間を減少させつつ、利益は向上させる』生産性向上が求められています。
生産性向上のために業務を効率化し、無駄な業務時間をなくし、より利益を創出する活動に業務時間を充てることが重要です。


機械学習・深層学習はこのような作業を得意とします。

スクリーンショット 2019-12-24 16.34.51.png


チャットボットでできる業務効率化

今回は特に業務効率化に役に立つ『チャットボットでお客様問い合わせ対応事例』をご紹介します。
チャットボットは同じ作業を早くくり返すことを得意としていて、質問内容とその回答を事前に学習させておくことで、まるで人と会話しているかのように、ユーザーが入力した文言に対して適切な回答を返します。
スクリーンショット 2019-12-24 16.38.07.png


例えば、こんなシーンはありませんか?
ーーーーーーーー
お客様から電話やメールで問い合わせが多く、対応が追いついていない。
膨大な問い合わせ対応業務により本来おこなうべきのコアな業務にも影響が出ている。業務時間が増えるだけではなく、回答が滞ることによりお客様にも迷惑がかかり、機会損失にもなりかねない状態。
ーーーーーーーー


特定の製品についての金額の質問など、問い合わせの多くを似た内容が占めていませんか?そうであれば、機械学習・深層学習の得意な業務です。


お客様問い合わせ業務をチャットボットで実現!

お客様への回答を自動返答することができれば、問い合わせ担当者の業務負担は大きく軽減します。それだけではなく、お客様をお待たせすることなく、必要なタイミングで情報を伝えることができます。
そうすることで、担当者はよりコアな業務に集中できるようになり、売上向上や社内環境改善などのさらなる利益にもつながるでしょう。


また、チャットボットへの問い合わせは、資料請求やメールでの問い合わせのように、個人情報を入力する必要はありません。
そのため、ユーザーは気軽に質問ができ、さらには営業時間外でもチャットボットが質問に答えてくれます。
このようなユーザーにとって快適な体験で購入前にも顧客の満足度が高まるだけではなく、顧客との接点が増えることで信頼性の向上や商品・サービスの認知度アップにもつながります。


さらに、多くのチャットボットはコミュニケーション内容をデータとして残すことができますので、幅広いユーザーのニーズを把握することも可能です。
このようなユーザーのニーズからチャットボットの回答やサイトの情報を改善したり、商品・サービスの改善につなげたりすることも可能になるのです。

その他活用例

問い合わせ対応だけではなく、このような使い方もできます。

スクリーンショット 2019-12-24 16.45.06.png

社内ヘルプデスク

問い合わせがあるのは、お客様からだけではありません。社内から情報システム部や総務部への問い合わせは毎日発生しています。
日々の問い合わせは軽微で同じようなものが多く、チャットボットで問い合わせから回答までを完結させてしまうことができます。
問い合わせをする側も気軽に利用でき、確認不足によるミスを減らすことも出来るでしょう。


「なぜ?」原因の特定

上記2つの事例からチャットボットは、相手と会話するようにシステムとやり取りできるサービスです。ここの『会話』に着目し、原因の特定に活用することもできます。
例えば、ミスが発生した際の原因特定。
報告書を提出し、上司との会話で原因を発見し、今後の対策を決めていきます。
この会話をチャットボットでおこなうことで、スピード感のある原因の特定がおこなえます。また、(本来あってはならないのですが、)当事者は上司ではなく、システムと会話するわけですから、より素直な回答をすることができ、正確な特定がおこなえるでしょう。


ユーザーへのレコメンド

ユーザーが好みや生活習慣を入力することで、ユーザーに適切な商品をおすすめすることができます。
例えば、化粧品は人の好みが大きく分かれるだけではなく、流行りの移り変わりも大きく、化粧品購入の際は、ユーザーは悩み、今までと同じものを購入することで妥協することも少なくはありません。
チャットボットを活用すると簡単に、どこでも、自分にピッタリの化粧品を見つけることができます。


おわりに

チャットボットは業務効率化を進めることはもちろん、幅広い活用方法があり、お客様ごとにぴったりな活用方法をご提案いたします。


当社ではみなさまの課題やお困り事を一緒に解決していきます。
下記にご興味がありましたら、問い合わせ口からご連絡ください。

  • チャットボットについてもっと詳しく知りたい
  • 困っていることを相談したい
  • 機械学習・深層学習は他になにが出来るのか興味ある


アクセルユニバースのご紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。
例えば、現在人がおこなっている作業をシステムが代わることで、人はより生産性の高い業務に携わることができます。


Twitter・Facebookで定期的に情報発信しています!

アクセルユニバースの栗木です。
今回実務の練習として、同じインターン生の入江君と共に模擬案件に取り組みました。
模擬案件とは、機械学習を用いることで実生活におけるどのような問題を解決できるかを考え、課題設定からデータの準備、前処理、学習、検証までの一連の作業を経験するための問題です。
今回の取り組みの中で僕達が取り組んた内容や理論を各ステップ毎に紹介していきたいと思います。記事は2部構成として、本記事では前半部分を記します。


Step. 1 課題設定

今回は無人レジの実現に挑戦します。
僕は並ぶことが苦手なので、どうにかレジの混雑を解消できないか考えました。
レジ処理は「いらっしゃいませー」「レジに商品を登録」「支払い」「ありがとうございましたー」の流れですよね。ここの「レジに商品を登録」をどうにかして効率化できれば、レジの混雑を解消でき、普及すれば、僕みたいな並びたくない族もたくさん買い物に行くはずです。


今回の目標は画像検出を用いてレジを打つことなくカメラに映すだけで合計金額を計算することとします。
画像を利用する価値を高めるためにタグが付けられない商品(食べ物)で、誰もが大好きなドーナツを対象とします。特にまだ無人化が進んでいないドーナツ屋さんの商品をトレーに載せた状態を想定しました。検出が成功すれば金額だけでなくカロリーなど+αの情報も表示が可能になりますね。


まずはじめにPart1ではひとつひとつのドーナツが何であるかを判定しました。先に結果だけお伝えすると、現時点で正答率が99%を超えていて今後の検討も楽しみです。


実際にシステムを作っていきます。まずは学習データを用意していきましょう。

Step. 2 学習データの準備

早速7種類のドーナツを購入し撮影を行いました。
角度や裏表を変えつつそれぞれ100枚の写真を撮りました。以下に写真の一例を示しておきます。
ちなみに撮影後においしく頂きました。^^

Donuts また、それぞれのドーナツの名前(ラベル)は以下とします。
8枚目の写真は物体検出する際にアノテーションされたデータが必要となるのでそのためのものです。アノテーションに関する詳細は後半の記事で説明したいと思います。


1.エンゼルフレンチ
2.ダブルチョコレート
3.エンゼルクリーム
4.ポン・デ・リング
5.オールドファッションハニー
6.ストロベリーカスタードフレンチ
7.チョコファッション
8.複数ドーナツ(物体検出用)

Step. 3 画像データの読み込み

学習のための画像データが準備出来たので、学習に備えてデータの読み込みとサイズを統一するためリサイズを行います。
今回はGoogle Colabratoryを使用するため、Google Driveに先程の画像をアップロードし以下のようにマウントすることでGoogle Colabratoryからデータにアクセス出来るようにします。
Google DriveにはDonuts Filesディレクトリを作成し、そこに先程の画像のうち複数ドーナツ以外の7種類の画像をディレクトリ毎にまとめてあります。(複数ドーナツの画像は後半で扱います)


from google.colab import drive  
drive.mount('/content/drive')

次にDonuts Files内の画像をディレクトリごとに読み込みリサイズを行います。

#必要なライブラリのimport
import os
import numpy as np
import glob
import cv2
from keras.utils import np_utils

IMAGE_SIZE = 100 #リサイズ後のサイズ指定

# Donuts Filesディレクトリから画像の読み込み及びリサイズ
def get_data_and_label(path):
  X = []
  Y = []
  label = {}
  i = 0
  for dir_name in os.listdir(path):
      label[dir_name] = i
      for file_path in glob.glob(path+'/'+dir_name+'/'+'*'):
        img = cv2.imread(file_path)
        img = cv2.resize(img,(IMAGE_SIZE,IMAGE_SIZE)) #100*100にリサイズ
        X.append(img)
        Y.append(i)
      i += 1
  X = np.array(X)
  Y = np.array(Y)
  X = X.astype('float32')
  X = X / 255.0 #RGBの値を正規化
  Y = np_utils.to_categorical(Y, len(label)) #One-hotベクトルの作成
  return X, Y, label

X, Y, label = get_data_and_label('drive/My Drive/Donuts Files')

これでデータの読み込みとリサイズは完了です。最後に精度の評価用にデータの分割を行います。

from sklearn.model_selection import train_test_split

# 学習データのうち20%を検証データにする
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20)

データの準備が出来たので、実際にモデルの学習と精度の検証を行いましょう。
最終目標は物体検出を行うことですが、前半である本記事ではまず1枚の画像に対して1つのラベルの予測を行う画像認識を実装しどの程度分類出来るか確認します。

Step. 4 モデル構築&学習

今回の問題は画像認識なので、モデルはCNN(畳み込みニューラルネットワーク)を使用します。
CNNの詳細については多くの方が記事にされているのでそちらを参考にして下さい。
簡単に説明すると、CNNは畳み込み層、プーリング層、全結合層から成り立っており、まず畳み込み層では複数のフィルタを使用して画像を畳み込むことでエッジやパターンなどの特徴を抽出します。
次にプーリング層でデータサイズを減らしつつ平行移動などの処理に対するロバスト性を獲得し、最後に通常のディープラーニングと同様の全結合層でこれまでに抽出した特徴とラベルの関係性を学習します。
CNNは2012年の画像認識コンペ(ILSVRC)で圧倒的な成績を残して注目されて以来、急速に発展を続けているので是非色々と調べてみて下さい。
それではKerasを用いてモデル構築を行いましょう。KerasはバックエンドでTensorFlowを利用するディープラーニングライブラリラッパーです。

#必要なライブラリのimport
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPool2D
from keras.optimizers import RMSprop  #最適化手法としてRMSpropを使用

# モデルの定義
model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(IMAGE_SIZE, IMAGE_SIZE, 3)))
model.add(MaxPool2D((2, 2), padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPool2D((2, 2), padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(MaxPool2D((2, 2), padding='same'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(len(label), activation='softmax', name='predicton'))

Kerasではモデルの構造をmodel.summary()から以下のように簡単に確認できるので非常に便利ですね。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 100, 100, 32)      896       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 50, 50, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 50, 50, 64)        18496     
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 25, 25, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 25, 25, 128)       73856     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 13, 13, 128)       0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 21632)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                1384512   
_________________________________________________________________
predicton (Dense)            (None, 7)                 455       
=================================================================
Total params: 1,478,215
Trainable params: 1,478,215
Non-trainable params: 0
_________________________________________________________________

それでは最後にモデルの学習と評価を行います。

# モデルのコンパイル
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])

#パラメータの指定
batch_size = 64
epochs = 20

# 学習
history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size)

# 検証データによるモデルの評価
print(model.evaluate(X_test, y_test))

最終的なlossと正解率は以下のようになりました。

loss = 0.02750563397655182
accuracy = 0.9927007299270073

正答率が99%を超えており非常に高いスコアとなりました。
今回はかなり問題設定が単純だったことと、本来は同じ種類であっても多くのドーナツを用意すべきところを1つのドーナツから学習データを作成したことがこのスコアにつながったと考えられます。

終わりに

ドーナツ検出に向けて前半である本記事では、目的を設定し画像を収集するところから単純な画像認識を行うところまでご紹介しました。
最近は画像認識を簡単に実装出来るので、是非身近なものなどの分類に挑戦してみて下さい。


さてドーナツの分類は高精度で行えることが確認できたので、後半はいよいよレジの無人化という課題に向けて検出に挑戦しようと思います。
後半では物体検出のアルゴリズムの概要や検出の様子を紹介したいと考えているので、後半もよろしくお願いします!


アクセルユニバース株式会社(以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。
今回挑戦している無人レジだけではなく、人と会話するかのようにシステムに問合せができるチャットボットや、カメラの前の人が誰であるか判別できる認証システムも検討しております。

  • 機械学習でどんな事ができるのか興味がある
  • 課題と感じている業務がある
  • 効率化したい業務がある


上記のような方はぜひ問い合わせページにご連絡ください。


Twitter・Facebookで定期的に情報発信しています!

はじめに

 最近のAIは音声認識や翻訳においては高い精度を出すことができます。
例えばAIが英語から日本語に翻訳する時、私達日本人が読んで多少の違和感があったりもしますが英文がどんなことを言っているのか理解することはできます。  
もしも機械が言語を理解して、人間と違和感なく会話できたらどうでしょう。そのようなことが可能になると、機械がどのようにして言語を理解したかを見ることによって、人間には気づくことができなかった新たな言語に関する発見ができるかもしれません。
さらには私達が子供の頃、お母さんなどの周りの言葉を聞いて徐々に話すようになり言葉を理解し始めました。これがどのようなメカニズムで理解されているか発見できるかもしれません。また、極論を言えば人間が機械に言語理解を任せれば良いので人間は時間をかけて言語を勉強する必要もなくなるかもしれません。このブログでは機械が言語を理解するための学問に関して簡単に書きます。

目次

  • はじめに

  • 機械が言語を理解するためには

  • 自然言語処理とは

  • 自然言語処理でできること

  • まとめ

機械が言語を理解するためには

 機械が言語を理解するということは機械がただ翻訳できればよいというわけでわありません。機械が文から人間がどのようなことを伝えたいか理解するためにはどのような壁があるでしょう。

  • 人間が話したり書いたりした文章から意味を理解する

  • 意味を理解したら人間が必要としてる回答を見つける

  • 回答を見つけたら人間にわかるように伝える

などなど...

 上記で挙げたものは全て難しいです。このような壁を乗り越えるためにどうすればよいでしょう。そこで登場するのが自然言語処理です。

自然言語処理とは

 自然言語処理とは、先程箇条書きであげた壁を乗り越えるための学問で機械に言語を理解させることを目標にしています。自然言語というのは人工言語(人工的に作られた言語、プログラミング言語)と対比させた言い方で人間が普段使っている言語のことです。

Alt text

 簡単に自然言語処理の歴史を説明します。

 1940〜1960年ごろは黎明期と呼ばれ1946年に初めてコンピュータが誕生しました。当初の目的は、弾道計算や暗号解読などの軍事目的でした。このコンピュータが翻訳にも使えるのではないかとロックフェーラー財団のウィーバーが考えました。この考えをきっかけに米国内で機械翻訳への関心が高まり1952年ジョージタウン大学とIBMが共同で翻訳プロジェクトを立ち上げロシア語から英語への小規模な翻訳実験が始まりました。これが自然言語処理の始まりです。 

その後、米国はソ連の科学技術の実態を知るべくロシア語から英語の翻訳に関する研究に関して多額の研究予算を投入しました。これにより機械翻訳は進展していきました。この時代は、コンピュータの処理能力が十分でなかったことも関係し研究者が自由な発想で夢を膨らましていたそうです。
スクリーンショット 2019-12-20 18.35.10.png

 1960〜1990年頃は忍耐期と呼ばれ莫大な研究費をかけましたが、研究が進展するに連れ、問題の難しさが認識されるような状況になりました。
1966年には機械翻訳の現状と将来に関する調査結果をALPAC報告書と呼ばれる報告書にまとめ、そこには近い将来に機械翻訳をすることは困難であり、言語の理解を目指す基礎的な研究を行うべきである、という内容のものでした。この報告書を機に、米国では機械翻訳においてほとんど研究費が出なくなりました。
更にこの頃は、自然言語処理の研究の難しさが明確になり、チェスのような明確に定義された問題における探索などに興味の中心が移っていきました。

この頃の自然言語処理に関する重要な出来事といえば1967年のBrown Corpusの発表です。
これは米国の言語の使用を調査する目的で、電子化された文書として初の100万語規模のコーパス(簡単に言えばテキスト文書の集合にある種の情報を付与したものです)で、新聞、雑誌、書籍など様々なジャンルのテキストをバランスよく収集したものを発表しました。1970年頃からコンピュータの処理能力が向上し言語やテキストを扱う基本的な環境が整い出しました。しかし、機械翻訳に代表される知的処理についてはまだ実用には精度が足りない状況でした。
スクリーンショット 2019-12-20 18.54.35.png

 1990年頃から現在までは発展期と呼ばれ、この頃はインターネットが世界的に普及し、社会基盤になった時期です。Brown Corpusの経験に学び各地で数億語規模のコーパスが作られました。1993年にはBrown Corpusのテキストに解釈を与えたPenn Treebankが最初の論文として発表されました。これは今後の機械学習に基づく自然言語処理研究を牽引したデータになりました。機械翻訳においても1980年代後半から統計的機械翻訳の研究を行いました。しかし、当時のコンピュータの処理能力や対訳コーパスの不足により十分に研究は発展しませんでした。
ところが、1990年代後半あたりから計算環境や対訳コーパス環境が整い、米国が機械翻訳によって紛争地域の素早い情報収集をするなどの目的から再度、多額の研究費を出すようになったこともあり、2000年以降、機械翻訳研究の大きな進展が見られました。またこの頃は、音声自動翻訳システムいわゆる通訳システムの研究も始められました。日本では東京オリンピック・パラリンピックが開催される2020年を目標に実用システムの開発を目指しています。このような自然言語処理の発展を強く印象づける出来事として2011年、Watsonが米国の人気クイズ番組「Jeopardy!」で人間チャンピオンに勝利しました。Watsonは約3000個のCPUからなる並列コンピュータによって、自然言語による質問を理解し、ウィキペディアなどの大量の情報の中から適切な回答を選択するシステムでした。更に、自然言語処理に大きな技術革新として2015年頃から本格化し始めたニューラルネットワークです。ニューラルネットワーク自体は1940年代に提案されていましたが当時のマシンパワーでは計算力が足りず難しい状況でした。


2000年代に入り、マシンパワーの増大、ビックデータの利用、アルゴリズムの改良などから再び注目されました。2010年代に入り画像認識、音声認識などの様々なタスクで大きな精度向上が見られるようになりました。特に、ニューラルネットワークを用いた翻訳手法、ニューラル機械翻訳は大きな精度向上をもたらし、機械翻訳を一気に実用レベルの技術に押し上げました。
fabio-oyXis2kALVg-unsplash.jpg

 自然言語処理の現状としてDeepLearningの登場もあり、文章を単語単位に分割し単語がどのように並んでいるかパターンを捉えることや、似ている単語を把握する事ができます。これに関しては実用化もされていて有名なものだと新聞記事の単語の関係性などを機械が学習し記事の重要な部分を抜き出してまとめてくれる要約サービスがあります。しかし、機械が言語を理解することはDeepLearningを用いた最新モデルとされているBERT(バート)でさえ実現することはできませんでした。機械が言語を理解するにはまだまだ研究段階であり時間を必要としているのが現状です。

自然言語処理でできること

自然言語処理でできることを今回は3つ紹介します。

コールセンターの対応を自動化

コールセンターの業務はマニュアル通りに電話応対をし人間がマニュアルを参照し適切な回答を選択しています。マニュアルで対応できない質問に対しては後日回答や担当の者に電話をつなげるなどの対処が必要です。自然言語処理を用いれば今まで人がマニュアル通りに応対していたところを、機械で実現できます。音声認識により機械が質問を理解し、自然言語処理を用いて質問にあった適切な回答を選択します。

教育現場において生徒のSNSを分析しいじめ発見

SNS分析をする際も自然言語処理は有効です。自然言語処理の中の文書分類を用い、SNSに書き込まれた文章に対してこの文章はいじめに関係しそうな単語がどの程度含まれているか確率的に分析し、その確率が高いときはいじめに関係している文章とし、生徒のいじめ早期発見につなげます。

コンビニやスーパーでアンケートを自動で分類するシステム

コンビニやスーパー等においてアンケートを自動で分類する際もクラスタリングを用いることで可能です。大量のアンケートから項目ごとに似た回答をしているものをグループ化し、アンケートの分類を自動化する事が可能です。具体的な手法としてはK-means方というのがあり詳しくはこちらを参考にして下さい。

まとめ

最近の話題だと、東ロボくんというロボットが東大に入れるかというプロジェクトがあります。これは、機械が言語を理解できたら確実に合格できると言われています。あくまで想像ですが、入学後も常に成績トップで人間には到底かなわない存在になってしまうかもしれません。
それほど自然言語処理という学問はかなり難しいとされています。難しい分、研究が進み機械が言語を理解したら私達の常識が変わったり、人間の言語に対する理解が深まり様々な場面で応用できることが期待されており、私達はその難問に挑戦します。

参考文献

コンピュータで言葉を理解する言葉の意味を処理するとは?

人間と人工知能の違い

チャットボットAIの現状を解説!自然言語処理は今なにができるの?

自然言語処理〔改訂版〕 (放送大学教材) 黒橋禎夫著


Twitter・Facebookで定期的に情報発信しています!

はじめに

 今回は世の中のトレンドを用いた株価予測をしてみたいと思います。今までに得た機械学習などの知識を実生活に用いてみたいと思っており、お金を稼ぐという意味で株価予測が候補にありました。以前、個人的にFXの値の上下予測を5分単位、1時間単位などで、テクニカル指標を用いて試してみたことがあったのですが、テクニカル指標だけでは期待した精度は出ませんでした。

 ということで、世の中のトレンドも特徴量として取り入れてみようと思い立ち、トレンドに左右されそうな株価で予測してみることにしました。

 よって、トレンドの影響具合を確認することをゴールとします。銘柄も絞ったほうがトレンドに対する影響が出やすいと考え、今回は任天堂を採用しました。任天堂を選んだ理由は特にないです。

結果

2015〜2019までの株価データを用い、過去6週のデータで次週の株価が上がるか下がるかの予測をし、

2015〜2018のデータで2019を予測:正解率60.4%

となりました!

取り組みの過程

以下で、取り組みの流れを説明します。

データを持ってくる

 皆さんは、Google Trendsというサービスをご存知でしょうか?トレンドを定量化する方法に悩んだ末たどり着いた方法がこれです。

 あるワードを入力すると、過去にGoogleでそのワードが検索された頻度(正規化済み)を示してくれます。CSVファイルとしてダウンロードもできるため、今回はこのサービスを活用しました。手軽さがこのサービスの良い点ですね。 カテゴリごとに分けることもできる(金融、ショッピングなど)ため、いくつかに分けてみました。

 最大で5年間のデータが持ってこれるようですが、1週間ごとになってしまいます。データ量が減ってしまうため、ここは少し残念です...

date

前処理など

以下の写真のように複数のカテゴリのデータも用います。 まずライブラリをインポートし、

 import pandas as pd
 import numpy as np
 import matplotlib.pyplot as plt
 import seaborn as sns
 %matplotlib inline

トレンドと、任天堂の株価のデータを一つにまとめます。

trend = pd.read_csv("multiTimeline_all.csv", header=1)
trend.columns = ["date", "value_all"]
trend["date"] = pd.to_datetime(trend["date"])

for cat in ["art_entertainment", "beauty", "business", "finance", "game", "law", "news", "shopping"]:
    cat_trend = pd.read_csv(f"multiTimeline_{cat}.csv", header=1)
    cat_trend.columns = ["date", f"value_{cat}"]
    cat_trend["date"] = pd.to_datetime(cat_trend["date"])
    trend = pd.merge(trend, cat_trend, on=["date"], how="left")

import pandas.tseries.offsets
trend["date"] = trend["date"] + offsets.Day(2)

import codecs
stock_price = pd.DataFrame()
for i in range(5):
    year = i + 2015
    with codecs.open(f"7974_{year}.csv", "r", "Shift-JIS", "ignore") as file:
        stock_price_each_year = pd.read_table(file, delimiter=",", header=1)
        stock_price = pd.concat([stock_price, stock_price_each_year], axis=0)

stock_price = stock_price[["日付", "出来高" , "終値調整値"]]
stock_price.columns = ["date", "volume", "close_price"]
stock_price["date"] = pd.to_datetime(stock_price["date"])

matrix = pd.merge(trend, stock_price, on=["date"], how="left")
matrix = matrix.dropna(subset=["volume"])

トレンドのデータは毎週日曜日の日付になっていたので、2日遅らせて火曜日としました(月曜日は休日で株価のデータがない場合が多いため)。 ここから1〜6週間前のトレンドを特徴量として作ります。

new_fe = []
for i in range(6):
    for col in ['value_all', 'value_art_entertainment', 'value_beauty',
       'value_business', 'value_finance', 'value_game', 'value_law',
       'value_news', 'value_shopping', 'volume', 'close_price']:
        matrix[f"{col}_{i+1}_weeks_ago"] = matrix[f"{col}"].shift(i+1)
        new_fe.append(f"{col}_{i+1}_weeks_ago")
matrix = matrix.drop([3, 4, 5, 6, 7])

そして、このnew_feの特徴量を予測に使います。

matrix["close_price_diff"] = matrix["close_price"] - matrix["close_price"].shift()
matrix["binary"] = matrix["close_price_diff"].apply(lambda x: 1 if x >= 0 else 0)

目的変数も作りました。

ちなみに、目的変数と特徴量(使わないもの含む)の相関の上位です。

date

モデルのトレーニングと予測

 モデルはLGBMを用いました。時系列データであるためLSTMも使ってみたかったのですが、データ量が少ないため断念しました。今回のLGBMのmetricはAUCです。

import lightgbm as lgb
from sklearn.metrics import accuracy_score

params = {'objective': 'binary',
          'max_depth': -1,
          'learning_rate': 0.01,
          "boosting_type": "gbdt",
          "bagging_seed": 44,
          "metric": "auc",
          "verbosity": -1,
          "random_state": 17
}
X = matrix[new_fe]
y = matrix["binary"]

columns = X.columns
y_oof = np.zeros(X.shape[0])
score = 0

feature_importances = pd.DataFrame()
feature_importances['feature'] = columns

X_train, X_valid = X[:X.shape[0]//5*4], X[X.shape[0]//5*4:]
y_train, y_valid = y[:X.shape[0]//5*4], y[X.shape[0]//5*4:]

dtrain = lgb.Dataset(X_train, label=y_train)
dvalid = lgb.Dataset(X_valid, label=y_valid)

clf = lgb.train(params, dtrain, 3000, valid_sets = [dtrain, dvalid], verbose_eval=100, early_stopping_rounds=400)

feature_importances[f'fold_{fold_n + 1}'] = clf.feature_importance(importance_type="gain")

def my_binary(x):
    if x >= 0:
        return 1
    else:
        return 0

y_pred_valid = clf.predict(X_valid)
y_oof[valid_index] = list(map(my_binary, y_pred_valid))


print(f"AC: {(accuracy_score(y_valid, list(map(my_binary, y_pred_valid))))}")

del X_train, X_valid, y_train, y_valid

AUCと正解率は以下です。

date

特徴量重要度の上位は以下のようになりました。

スクリーンショット 2019-12-13 15.35.23.png

また、この予測した通りに取引した場合の結果も計算しました。

def my_profit(diff, ans, pred):
    if ans == pred:
        return abs(diff)
    else:
        return abs(diff) * -1
sum(matrix.iloc[int(X.shape[0]/20):, :][["close_price_diff", "binary", "pred"]].apply(lambda x: my_profit(x[0], x[1], x[2]), axis=1).values)

結果は以下です。

date

つまり、毎回100株の取引をすると30万円の儲けです!これはなかなか嬉しいですね

結果の考察

 データが240と少ないため、断定はできませんが、トレンドと株価には何かしらの関係があるのではないかと考えられます。

 特徴量重要度をみると、「取引量」のほか、「アート、エンターテイメント」、「金融」、「美容、フィットネス」などのカテゴリのトレンドが重要であったことがわかります。また、6週間前の値が特徴量として効いていたりもするようで、非常に興味深いです。少し追加で調べていきます。

 まず、Google Trendsから得られるのはあくまで検索数の上下であり、それは任天堂のプラスなトレンドもマイナスなトレンドも同時に反映しています。にも関わらず、なぜ上下を60%で予測できたのかについて考えました。僕はこれについて、カテゴリごとにトレンドを分けた特徴量を加えたからではないかという考えに至りました。上に記載した特徴量重要度をみてみると、value_all、すなわち全体の検索数の特徴量があまり予測に寄与していないことがわかります。

date

これはカテゴリごとの時間の変化での検索数(正規化済み)の上下の1部のグラフですが、カテゴリによって動きが大きく違います。

 つまり、任天堂にとってプラスなトレンドを表すカテゴリ、逆にマイナスを表すカテゴリがあるのではないでしょうか。例えば、アート、エンターテイメントの検索はマイナスよりプラスな意味での検索をする人が多く、法律の検索は告訴した、告訴されたなどのマイナスな検索が多そうです。

date

上の写真は法律カテゴリの検索数ですが、2018年1月付近に急増加しています。1月10日はコロプラが、12月22日付で特許権侵害に関する訴訟を任天堂より提起され、1月9日に訴状内容を確認したことを発表した日です。

まとめ

 トレンドの特徴量だけでここまでの精度が出るとは思っていませんでした。トレンドの測り方はGoogle Trends 以外にもツイッターなどのSNSがあるため、これらを増やしていくことで長期間での株価の予測は可能なのではないでしょうか。株価は様々なものに影響を受けるものであるため、どんな特徴量を足していくか?が重要だと思われます。


Twitter・Facebookで定期的に情報発信しています!

目次

  1. 海洋エネルギーとは?
  2. 海洋エネルギー発電の普及に向けた課題とその解決策
  3. 機械学習を用いた海洋エネルギー発電の課題への解決策
  4. これから私が取り組むこと
  5. 参考文献


1. 海洋エネルギーとは?

 海洋再生可能エネルギー(略して、海洋エネルギー)とは、洋上風力(図1)、波力(図2、3)、海流(図4)、潮流(図5)、潮汐、海洋温度差、塩分濃度差といった再生可能エネルギーを指す。地球表面の約70%は海で覆われているため、海洋エネルギーは非常に膨大で、決して枯渇することはないエネルギーである。我が国の200海里経済水域の面積は世界第6位であり、国民一人当たりの海域面積は主要先進国では最も大きい。このことからして、我が国が強力に開発すべき再生可能エネルギーは、海洋エネルギーである。

Ocean energy

図1 長崎県五島市の洋上風力発電装置「はえんかぜ」



Ocean energy

図2 Ocean Power Technologies社の波力発電装置



Ocean energy

図3 Wello Oy社の波力発電装置



Ocean energy

図4 IHIの海流発電装置



Ocean energy

図5 SIMEC Atlantis Energy社の潮流発電装置(これが海中に設置される)


 そもそも再生可能エネルギーとは、地球温暖化の原因である温室効果ガスを排出せず、環境にやさしく、枯渇する心配がないエネルギーのことである。地球温暖化が進行すると、

  • 高潮や沿岸部の洪水、海面上昇による被害
  • 大都市部への内水氾濫による被害
  • 極端な気象現象によるインフラ機能停止
  • 熱波による死亡や疾病
  • 気温上昇や干ばつによる食料不足や食料安全保障の欠如
  • 水資源不足と農業生産減少
  • 陸域や淡水の生態系、生物多様性がもたらす様々なサービスの損失
  • 海域の生態系、生物多様性への影響
    上記のような多くの問題が生じる。


 化石燃料(石油、天然ガス、石炭)による発電は、温室効果ガス(二酸化炭素など)を排出し、地球温暖化を進める発電方法である。また、資源に乏しい我が国は、エネルギー供給のうち、化石燃料が8割以上を占めており、そのほとんどを海外からの輸入に頼っている。特に東日本大震災後、エネルギー自給率は10%を下回っており、エネルギー安定供給の観点から、この改善を図っていく必要がある。


 再生可能エネルギーは国産のエネルギー源であるため、エネルギー自給率の改善にも寄与することができる。更に、東日本大震災による原発事故を受け、原子力発電所が東日本大震災並の地震に耐え得るには、設計の見直しが必要であり、今後安全対策費が高くなることが予想されるため、発電コストは今後も高くなる。また、放射性廃棄物の処理についてもまだ未解決の問題である。このことから再生可能エネルギーは今非常に注目を集めている。


 では、その再生可能エネルギー発電と言えば、太陽光発電や風力発電が現在主流であるが、これらに対抗できるほどのメリットが海洋エネルギー発電にあるのかと疑問を抱く方は多いかもしれない。太陽光発電は、夜間や雨・曇りの日などには発電できない。即ち、設備利用率(発電設備の実際の発電量が仮にフル稼働していた際の発電量の何パーセントほどであるのかを示す数値)が低い。それに対し、海洋エネルギー発電は、夜間でも、天候が多少悪くても稼働できるため、設備利用率は太陽光発電に比べて高い。


 また陸上の風力発電は土地や道路の制約があり、特に国土が狭く地形も複雑な日本では、風の条件が良い場所はどうしても限られ、景観や騒音の問題によって大型化できないのに対し、同じ風力でも洋上風力発電ではその心配はない。表1は再生可能エネルギーの設備利用率の比較である。海洋エネルギー発電には他の再生可能エネルギーより優れた点がある。

スクリーンショット 2019-12-12 12.32.39.png


2. 海洋エネルギー発電の普及に向けた課題とその解決策

 現在、海洋エネルギー発電は、まだ世界的にも研究開発もしくは実証研究の段階にあり、本格的な事業化に向けて、以下の課題を克服しなければならない。

スクリーンショット 2019-12-10 14.55.02.png
 まず、機械学習を活用しない解決策を課題毎に述べる。


<課題①「電力需要量とのバランスが取りにくい」>

  • 蓄電装置や電力の水素への転換などの蓄電方法の開発・改良を行う。



<課題②「発電効率が火力発電や原子力発電などに比べて低い」、課題⑥「発電コストが高い」>

  • 単機では発電効率が低く発電コストは高いが、数を増やすことで発電効率を向上させ、発電コストも下げる。(再生可能エネルギーは数が増えることで発電コストが急減する)

Ocean energy

図6 ドイツのブーテンディーク洋上風力発電所



<課題⑤「他の再生可能エネルギーと比べて実績が足りない」>

  • 水槽試験だけでなく長期的な実海域試験を単機だけでなく複数機で行う。
  • EMEC(欧州海洋エネルギーセンター)のような海洋エネルギーの実海域試験を行う研究所を我が国にも造る。

スクリーンショット 2019-12-10 17.26.12.png

図7 EMECの景観を配慮した波力発電テストサイトの変電施設(長崎海洋大使・海外先進地 派遣事業報告書)



<課題⑦「試験運転であっても国や地方自治体への計画・建設の許可が必要」>

  • 技術的課題、経済的課題、環境的課題をできる限り解決し、国や地方自治体の認可をもらえるようにする。



<課題⑧「航行や漁業などの海域利用者や地域の方々の理解が必要」>

  • 海域利用者と十分に協議し、周辺住民への情報の開示する。
  • 地域の活性化に繋がることを周辺住民へ伝える。
  • 発電機周辺には魚が集まってくるなど、漁業にもメリットがあることを伝える。

Ocean energy

図8 発電装置に付着した海藻に集まる魚



<課題⑨「辺環境や生物生態系への懸念」>

  • 実海域試験を行い、周辺環境や生物生態系への影響を調査し評価する。


3. 機械学習を用いた海洋エネルギー発電の課題への解決策

 海洋エネルギーの技術的課題を解決するためには当然、発電装置や蓄電装置、海底ケーブルなどの開発・改良を行う必要があるが、ここでは、太陽光発電や陸上風力発電で取り組まれている解決策を参考に私が考えた、機械学習(人工知能)を用いた解決策を紹介する。


<課題①「電力需要量とのバランスが取りにくい」、課題③「無駄な待機運転の時間がある」への解決策>

~発電量・電力需要量予測と制御~

 発電装置周辺の気象・海象データを説明変数として発電量を予測し、カレンダー条件(時間帯、曜日など)と気温や日射強度などの気象条件を説明変数として電力需要量を予測することで、需要と供給の差が確認できる。そして電力需要量の送電にかかる時間分先の予測値と同量を発電するように発電装置を制御すれば、需要と供給のバランスを保ちながら発電することができる。発電機の無駄な待機時間も削減され、設備稼働率も向上する。



<課題②「発電効率が火力発電や原子力発電などに比べて低い」への解決策>

~機械学習を用いた制御~

 例えば洋上風力発電や海流発電、潮流発電ならば、効率よく電力を取り出せる羽根の回転数が風速または流速によって異なるので、回転数を機械学習によって制御することで、発電効率を最大化することができる。
 また、これは私のアイデアではないが、波力発電装置の発電量の平均値が最大になるように機械学習(強化学習)を用いて制御するといった研究も行われている。



<課題③「無駄な待機運転の時間がある」、課題④「台風など局所的に厳しい海象条件下での安全性の懸念」への解決策>

~発電装置が遭遇する気象・海象を予測~

 発電装置が遭遇する気象や海象を事前に予測しておくことで、台風や大波が来る前に発電をやめ、安全を確保する状態に切り替えることができる。また台風や大波といった本当に稼働停止しなくては損傷してしまう場合以外は稼働することができ、無駄な待機時間が減少する。



<課題③「長いメンテナンスにより稼働時間が減る」、課題⑥「海上工事や潜水作業のコストが高い」への解決策>

~海中ロボットによるメンテナンス~

 メンテナンス時の潜水作業を人が行うのではなく、機械学習を搭載した海中ロボットが行う。 水中を自動運転したり、画像診断などによって腐食や付着物を検知するなど、メンテナンス作業を効率よく行い、発電装置の稼働時間を増やす。



<課題④「台風など局所的に厳しい海象条件下での安全性の懸念」への解決策>

~異常検知~

 発電装置に速度センサや加速度センサを設置して、発電機の運動を測定し、応力(単位面積当たりの力)センサを設置して、発電機の応力を測定することで、運動や応力のデータが得られ、それを説明変数として、発電機の異常検知をする。
異常を確認すると稼働停止するようにしておくことで、安全性が向上する。


4. これから私が取り組むこと

 私は何としてでも、海洋エネルギーを我が国で普及させたいと考えている。そのために今回海洋エネルギー発電の課題について取り上げてきた。そして3章で示したように、海洋エネルギーを普及させる方法の一つとして機械学習を用いる方法があり、私はこれに非常に興味を持ち、可能性を感じている。
 今後は、「機械学習を用いた海洋エネルギー発電の効率向上と制御」「機械学習を用いた発電装置などの運動する海洋構造物の安全性確保と評価」をテーマに研究を行っていく。具体的には3章で紹介した「機械学習を用いた制御」や「異常検知」について着目しようと考えている。また安全性の評価として機械学習を用いることができないかなど、海洋エネルギーに対する機械学習の新たな用途の探求も行っていく。
 このような私の研究によって、海洋エネルギー発電の課題が一つずつ解決して行き、海洋エネルギー発電が事業化することで、我が国だけでなく世界中のエネルギー問題が解決することを私は期待している。しかし、この研究を進めるためには海洋エネルギーに関するデータが必要であることは言うまでもない。


5. 参考文献


Twitter・Facebookで定期的に情報発信しています!

「機械学習」


耳にすることが多くなった単語ですが、そもそも機械学習ってなんでしょうか。
AI(人工知能)との違いは?なにが出来てなにが出来ないのでしょうか?


本日は上記を解説し、実際に活用されている事例をご紹介します。


機械学習とは

機械学習はAIの1つの要素です。
AIの中に機械学習があり、機械学習にディープラーニング(深層学習)があります。


機械学習とは...

  • 大量のデータの特徴や法則を捉え、未知のデータを予測・分類する。
  • 分析の精度は100%ではないが向上させることができる。
  • 目的に応じて手法を使い分ける必要がある。


機械学習ができないこと

  • 企画立案などの新しいアイデアを生み出すこと
  • 喜怒哀楽を感じたり、自発的に考えること


機械学習が得意なこと

  • 同じ作業を繰り返しおこなうこと
  • 過去のデータを正しく学習すること
  • 大量のデータを分析すること
  • 人間がおこなうと時間がかかる膨大なデータを扱うこと


機械学習の分類と活用例

『機械学習が得意なこと』を分類し、ビジネスでの活用例を紹介します。


(1)「同じ作業を繰り返しおこなうこと」...作業を黙々とミスなくやってくれる「働き者」タイプ
 作業を確実にミスなく実施し、新たな労働力として人間を助けます。
人間がおこなっていた簡易な業務と代わることができるため、労働人口の減少や長時間労働の削減の問題の解決に役立ちます。
空いた時間を、利益を生むための営業活動や、さらに労働環境を良くするための検討時間に替えることができ、生産性の向上を後押しします。


▼活用例 機械学習事例

・無人レジ
レジで商品画像を読み取ると金額が算出されます。レジでの混雑緩和や人件費の削減に効果的です。
当社でも開発中で、下のアイコンから検討状況を確認できます。


(2)「過去のデータを正しく学習すること」...熟練者の技術を習得する「熟練社員」
 人員確保の困難や、少子高齢化における熟練者の大量退職によって、知の継承が懸念されている分野において、熟練者が保有している技術を再現できます。
技術、ノウハウの再現性を高めることで、退職への対応だけでなく、新人教育にも活用できます。


▼活用例
機械学習事例

・不良品検知/異常検知
 機械学習で画像や、振動、音などの信号などの違いを認識し、良品と不良品(または良品と差が大きい物)、正常と異常(または正常と差が大きいもの)を識別します。
・コールセンター問い合わせ業務
熟練者の回答や対応を、機械に学習させ、いつでも引き出せるようにすることで、顧客対応レベルを全体的に向上させます。

不良品検知


(3)「大量のデータを分析すること」...データを即時に読んで判断する「聖徳太子」
 人手を要し人間が苦手とする大量の情報、ビッグデータの分析をおこないます。


▼活用例 機械学習事例

・リーガル分析
 訴訟事案は毎年どんどん増え、大量のデータになります。六法全書や過去の訴訟事案のデータに検索タグ付けをおこない、自然言語処理を使い検索し、役立つ情報を瞬時に取り出し分析する、言わば「AI弁護士」、「AI裁判官」の役割をします。
   


(4)「人間がおこなうと時間がかかる膨大なデータを扱うこと」...人間にできなかったことをやってくれる「天才社員」
 予測や最適化など人間では実施に時間がかかり、且つ、担当が限られる業務をおこないます。人間では扱うことが難しい膨大なデータも機械学習で扱えます。


▼活用例 機械学習とは

・創薬
 新薬の開発には膨大な時間とお金がかかっています。それは病気に適合する物質(リード化合物)を発見するまでに、試行錯誤に途方も無い時間がかかっていることが原因の一つです機械学習を用いて過去の事例から適合度の高いリード化合物の構造式を探すことで、適合度の高いアタリを発見するまでの時間を削減します。このようにリード化合物を最適化するまでのサイクルを短くすることで、コスト削減をも実現します。


機械学習のこれから

 近年、少子高齢化による労働人口の減少や労働時間の削減などによって、十分な労働力の確保や業務効率化による生産性向上が課題になっている。


「機械学習」と「AI」。
どちらも単に「計算処理の早いコンピュータ」ではなく、「人間のようなコンピュータ」といった感覚のもので、人間の代わりに24時間働いてくれたり、作業をミスなく実施したり、人間には不可能なことを実現します。


 機械学習は既に研究段階から実用化の段階に進み、あらゆる産業に変化をもたらしています。これから更に機械学習は世の中を豊かにする技術として受け入れられ、運用されていくため、今後は機械学習をどのくらい活用できるかが、社会やビジネスの発展に直接影響することも考えられます。

  「機械学習は人間の仕事を奪う」


という意見もありますが、「機械学習ができないこと」で挙げたように、企画立案や戦略を立てることは人間の仕事です。人間による戦略や企画に機械学習を活用する、といった役割分担になっていくでしょう。
そのため「人間 VS 機械学習」ではなく、「人間 with 機械学習」で発展していくと予想されます。


本記事でご覧いただいたように、AI・機械学習は幅広い活用方法があり、お客様ごとの活用方法が必要です。
当社ではみなさまの課題やお困り事を一緒に解決していきます。
下記にご興味がありましたら、問い合わせ口からご連絡ください。

  • AI・機械学習の導入を考えている
  • 活用事例についてもっと詳しく知りたい
  • 他になにが出来るのか興味がある


当社、アクセルユニバースの紹介

私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。
例えば、現在人がおこなっている作業をシステムが代わることで、人はより生産性の高い業務に携わることができます。


acceluniverse


参考文献

・梅田 弘之『エンジニアなら知っておきたいAIのキホン 機械学習・統計学・アルゴリズムをやさしく解説』インプレス、2019年
・南野 充則『未来IT図解 これからのディープラーニングビジネス』MdN、2019年


Twitter・Facebookで定期的に情報発信しています!

アクセルユニバース株式会社(以下 当社)では『機械学習・深層学習で世界を笑顔にする』を掲げ、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。

今日は世界を笑顔にしたい私が
「ドラえもんのひみつ道具があれば、みんな笑顔になるのではないか!?」
と機械学習を活用してひみつ道具の実現を考えてみました。


目次

  • ひみつ道具の検討
  • 実現したいこと
  • 結果と今後


ひみつ道具の検討

ずばり、今回実現を検討したいひみつ道具は「ムードもりあげ楽団」です。 ひみつ道具の実現
出典:ドラえもんのひみつ道具を一つもらえるとしたら
人の気分を盛り上げる楽団ロボット。その時の気分によって楽曲を演奏してくれます。
人は嬉しい時には楽しい音楽、悲しい時には悲しい音楽が聴きたくなるものです。
今回は人の声から感情を判定し、適切な音楽が流れる仕組みを検討します!


実現したいこと

人間の発した音声からその時の感情を判定し、適切な音楽が流れる仕組みです。
ひみつ道具の実現
実現するために、システムが人の発語を聞き取り感情を分析し、予め決めておいた感情群に判定します。そして判定された感情によって異なる音楽が流れることが必要です。
今回は機械学習の範囲の、感情分析〜判定を考えていきましょう。感情の変化は音声の韻律特徴に表れるので、韻律特徴により4つの感情[喜び/悲しみ/怒り/フラット]に分類します。
いくつか文献を読んでこのように計画しました。文献は最後に紹介します。

ひみつ道具の実現

データの準備
複数の人から発声データを集め、音の高さ・強さを時系列データにし、適当な長さに分割する。
学習データ : 話者と面識のある人が音声データを聴き、感情を判定(ラベル付け)し、分割する。

モデル
SVM(Support Vector Machine)
未学習データに対する高い汎化性能があり、高い認識性能が認められている。
SVMについて当社ブログ/最初に学ぶ 2分類SVMモデルの基本

評価
交差検証法(クロスバリデーション)
膨大なデータを用意することが難しく、また人の声のため学習にムラがあるかも、と懸念し汎化を高めるために、全てを学習データとして扱う本法を挙げる。
少し計算に時間がかかるかも...。


結果と今後

今回は計画だけで実装はしていませんが、愛知工業大学での結果は精度60%程度で判定できています。
「短時間発話からの音声感情認識のための音声データ選択法に関する検討」
音声データを短く切ることで、特徴として捉える範囲が減り、似たグラフの動きを誤判定してしまうようで若干精度が低下しているようです。
別の研究だと、音声データだけではなく、表情も感情判定に使用し、こちらは精度68%〜70%と結果が出ています。
また、一度判定させたものに結果をフィードバックすることでさらなる精度向上も見込めると思います。


どうやら実現可能性は多いにありそうなので社内でウケが良ければ実装に向けて進めていきます!
ドラえもんひみつ道具シリーズはシリーズ化したいので面白いひみつ道具やお気に入りがあれば是非コメントください。


当社ではインターン生が取り組んでいることを技術ブログで紹介しています。
文系学部2年生の私が「SIGNATE」初参加で上位8%に入った話論文 Attention Is All You Need から Attentionモデルの解説等が公開されています。
定期的にメルマガでも情報配信予定なので、問い合わせページに「メルマガ登録希望」とご連絡ください。


参考

平井有三:"初めてのパターン認識"森北出版 2012
小野谷信一 長屋優子 : "表情と音声を用いたサポートベクタマシンによる感情認識"2014
短時間発話からの音声感情認識のための音声データ選択法に関する検討
SVMを用いた自発対話音声の感情認識における学習データの検討

はじめに

現代社会には、音楽というものが氾濫しています。
そして多くの人は音楽を聞くというと、生演奏されているものを聞くことよりもCDやサブスク型サービスなど、一度デジタルなデータになったものをアナログデータへ変換して視聴することの方がよっぽど多いでしょう。 このデータ化によって普段聞いているだけでは気づかないような、特徴、性質に目を向け、そういった見えなかったデータを使い既存のものをもっと充実させる、新しいものを作り出すことはできないでしょうか。 この記事ではそういった取り組みや手法の一端を紹介できればと思います。

目次

MIRとは

特徴量

機械学習x音楽の実用例

参考文献

MIRの現状

こういった音データ(特に音楽)から情報を抽出、分析する分野は、MIR(Music Information Retrieval)と呼ばれています。 ISMIRという世界規模のMIRに関する研究が発表される学会があり、2019年は20周年という大きな区切りの年でした。しかし、そこで発表された論文の一つの中で法的制限によって研究が進めづらく、また大企業とそれ以外とで資金面の違いから多様な研究が阻害されることによる再現性の危機等が指摘されています。 また、日本のGoogleで2019年11月現在MIRでと検索しても1ページ目に音楽分野のMIRの記事は出てこなく、あまり広く普及しているとはいえないのが現状でしょう。(MIRという略語が他にも多く当てられているということもありますが・・)

特徴量

このブログは技術ブログなので実際に使われている特徴量(データを扱う際にデータの特性を数値にしたもの)、またその抽出に関していくつか紹介していきます。 ここでは例としてヴィヴァルディの四季から春の第1楽章と冬の第2楽章のデータを扱っていきます。
Spring
scenary-spring.jpg

Winter
winter-image
spring.png winter.png

下グラフは、それぞれの信号をサンプリング間隔(sr=22050)でグラフ化したものです。 春は振れ幅が大きいところと小さいところがはっきりと分かれているのがわかります。 一方、冬は全体的に振れ幅が小さく、また曲自体も穏やかな印象を受けます。

1.平均平方2乗エネルギー(Root Means Square Energy)

EがErrorではなくEnergyなので読むときに注意が必要な値。単にRMSと書いている場合もあります。 表すものは単純にその音楽がどのくらいのエネルギー(音の大きさ)をもっているかをあらわし、下記スペクトル流動と相性が良いとされています。 オリジナルの波とそのまま比べると大きさだと見比べづらいので、0-6秒までをプロットします。 spring-rmse おおよそオリジナルの波と同じ形を描いています。 エネルギーが大きいところは、激しいと読み替えることができるように思えます。しかし、その考え方でこの特徴量を利用すると大きな落とし穴があります。 春のヴァイオリンソロ部分(1:57〜)は、オリジナルの波を見てみると、振れ幅が小さくなっています。 しかし、だからといって穏やかなわけではありません。しかし、rmseを使うと、ソロパートなど、合奏に比べ音量が負けやすいところは数値が小さくでてしまいます。 結局、この特徴量はどれだけ音が大きいかということしかわかりません。

2.ゼロ交差率(Zero Crossing Rate)

音の波が正から負に変化する頻度を表した数値で、ノイズ量(不安定さ)を表す一つの手法とされています。 オリジナルのグラフは、波が潰れてしまっているので拡大して見てみます。 spring-extended Springの1秒からsr=300まで(約0.01秒)ののグラフです。 波が単純でないので分かりづらいですが、この区間の場合だとZCR=8となります。 しかし、高音は元々波の間隔が狭いため、高音が多い曲では適切に動作しません。

3.短時間フーリエ変換(Short Time Fourier Transform: STFT)

曲によって演奏時間は違い、それらの異なる長さのデータを扱うために、一定の時間(短時間)に対して離散フーリエ変換(一般的に高速フーリエ変換)を行い、それを繰り返すことによって、どのように曲が展開されているかを知る手法です。 フーリエ変換の概要については、省略しますが、簡単に言うと、オリジナルのグラフのように振れ幅(正確には無次元量)と時間軸で表されているものを、一定の時間内に、どのくらいの強さの振動がどのくらいあるかに変換する手法です。 STFTによって求められる周波数スペクトル(どの周波数の音がどれくらいあるか)を用いて下で紹介するようなMSCCなどへと発展できます。
spring-stft winter-stft

4.定Q変換(Constant-Q Transform)

STFTでは扱う時間を増やすと多くの周波数を含むことができる可能性があるため一般に周波数分解能は高くなりますが、時間間隔が長いためにその中で起こっている変化をとらえにくくなるというジレンマを抱えています。 定Q変換では、この問題に対応するために分析する周波数間隔を人間の耳が感じているとされているように対数的に設定します。 つまり、人間の耳と同じように特定の周波数(低域)に対しては敏感に分析し、そうでないところ(高域)は荒く分析対応するのが、定Q変換の考え方です。 これによって効率よく必要なデータ分析が行なえます。
spring-conq winter-conq
上記フーリエ変換後のスペクトログラムに比べ人間の耳に聞こえやすい音域が強調され広がっているのがわかります。 C4はト音記号の一番低いド(普通のド)で、 約261.626Hzとされていて、オクターブ上がるごとに約倍音(平均律のため誤差が生じる)になります。

5.ログメルスペクトログラム(Log-melspectrogram)

単にメルスペクトログラムと言われていることもあります。 上記1や2(1が主流)で得られた振幅スペクトルをメル尺度(実際の音と人間の音高知覚の差異を吸収したもの)で扱うためにメルフィルターバンクを適応たものです。
spring-log-mel winter-log-mel
前提となる考え方が定Qと同じく人間の耳に適応させた特徴量を作り出すことを目的としているためスペクトログラムは似ていますが、低域に対してブーストされていないため、定Qを下にずらした形となっているのがわかります。

6.メル頻度ケプストラム係数(Mel Frequency Cepstrum Coefficients: MFCC)

ケプストラム(Cepstrum)はスペクトル(Spectrum)の最初の4文字をひっくり返した造語とのことで、スペクトル信号をフーリエ変換した結果であるそうです。 上記3の値を離散コサイン変換し、その値の低次元成分部分で構成されています。 また、この値はもともと喋り声などのデータに使われていた特徴量で、離散コサイン変換の段階で空間的特性を削除するため、ディープラーニングの際に適さないのではないかという主張もあります。
spring-mfcc winter-mfcc
たしかに、定Qやログメルと比べると変化のある面積が少なくなっています。

機械学習×音楽の実用例

ずらずらといくつか紹介しましたが、一体これらの値を用いてどういったことができるのでしょうか。 例えば、今音楽を聞く手段として、ひとつの主流な形になっているものとしてサブスクライブ型サービスがあります。 定額で契約期間中数千万曲の中から好きなだけ好きなものを聞けるという画期的なサービスです。 しかし、やはりこれだけの曲数があると何を聞くか迷い結局同じ曲を聞くにとどまることが多いでしょう。 そこで各社は、様々な方法でレコメンド機能を実装しています。多くは、その曲を聞いた他の多くのユーザーがよく聞いている曲が選ばれています(協調フィルタリング)。しかし、これでは話題の曲など普段そういった曲を聞かないような人も聞いている曲では正しいおすすめはできないでしょう。 音楽サブスクライブ配信大手のSpotifyではこれに加え、音声データを用いた学習を活用しています。純粋にその曲に似ている、同じ雰囲気の曲を探しだし、Discover Weeklyで他社に先んじた高精度のレコメンド機能を提供しています。 また、今年の3月にgoogleが適当に音を数個与えるとそれに対して和音を足して"バッハっぽい音楽"を作り出すというシステムを発表しました。 このように機械学習は、既存のものを踏襲しつつ新たなものを発見したり生み出すことができ、今まで気が付かなかった可能性にも気づかせてくれるのです。


定期的にメルマガでも情報配信をしています。
ご希望の方は問い合わせページに「メルマガ登録希望」とご連絡ください。

参考文献、使用音源

  • (Anniversary paper) Data Usage in MIR: History & Future Recommendations
  • Notes on Music Information Retrieval
  • [Python]ただひたすらにフーリエ変換[備忘録]
  • MFCC(メル周波数ケプストラム係数)入門
  • LibROSA Document
  • [Python] Constant-Q 変換(対数周波数スペクトログラム)
  • Deep Learning for Audio Signal Processing
  • JSYMBOLIC 2.2: EXTRACTING FEATURES FROM SYMBOLIC MUSIC FOR USE IN MUSICOLOGICAL AND MIR RESEARCH
  • COMPOSER RECOGNITION VASED ON 2D-FILTERED PIANO-ROLLS
  • Spotify's Recommendation Engine
  • Googleが機械学習で誰でもバッハっぽく作曲できるGoogle Doodleを公開中

  • The Four Seasons(Vivaldi) by John Harrison with the Wichita State University Chamber https://freemusicarchive.org/music/JohnHarrisonwiththeWichitaStateUniversityChamberPlayers/TheFourSeasons_Vivaldi 協奏曲第1番ホ長調 RV 269「春」(La Primavera)第1楽章 協奏曲第4番ヘ短調 RV 297「冬」(L'Inverno)  第2楽章

    現在、多くの業界でAI・機械学習の重要性が増加しています。

    背景のひとつに労働人口の減少による人手不足があります。帝国データバンクの調査によると、「正社員不足」状態の企業は全体の50.3%を占めています。
    人手不足も解消のためには、業務自体を削減すること、または業務を人から代替する必要があります。

    ここでは人間の目の代わりとなり、判断をおこなう機械学習である画像認識技術を紹介します。

    スタンフォード大の研究者らがAI関連の研究開発や経済、教育、各国の動向など多様なデータをまとめた「AI Index」の2019年版では、ここ1年半でクラウドインフラで大規模な画像分類システムを学習させるのに必要な時間が、2017年10月の約3時間から2019年7月の約88秒に短縮され、同様に学習させるコストも下がったと報告されています。 時間・マシンスペックの制限が徐々になくなることで機械学習の画像認識分野のビジネス活用はますます注目されていきます。


    目次


    機械学習での画像認識とは

    画像からパターンを認識し、何が写っているのか判断することが画像認識です。光景の知覚・認識をコンピュータがおこなうことで、人間がおこなうはずであった画像の判別や物体の検出などを自動化することができます。

    例えば、動物が写っている写真をその動物ごとに分類することもできますし、製造業でのシーンでは正解とは違うもの(不良品)を見つけることもできます。本記事の最後でも紹介しますが、画像認識は様々な分野でも応用できることと、ディープラーニングの登場で精度が向上したこと、高性能なモデルの開発で学習(構築)時間を削減したことから急速にビジネス活用が進みました。

    元々はロボットにおいて外界にある物体検出の手段として考えられた画像認識技術でしたが、1970年代における人間の知識をプログラムとして直接書く方式から、画像の形、色、動きなどの幾何学的な特徴を認識する方法にシフトして大きな進歩を遂げています。

    技術の発展により、画像認識はAI(人工知能)が活用される一分野として現在も急速に発展しています。それでは画像から物体を検出しそれが何であるか判定する仕組みをご紹介します。


    画像認識の仕組み

    一般的な画像認識のプロセスをご紹介します。

    Image recognition


    画像認識のモデルの構築

    画像認識をおこなう際、「画像のどこに何が写っているのか」を認識するためのモデルが必要です。機械学習を用いて学習データからこのような検出・判別するモデルを構築します。モデルをあらかじめ構築しておいて、認識する画像に対して判別結果を出力する仕組みを作ります。


    特徴抽出

    モデルで実際に画像を判別する際には、画像の中から 特徴抽出する必要があります。画像の局所的な特徴の抽出や画像に含まれるノイズの除去などを、画像処理の手法や統計的な手法によっておこないます。判別に必要のない情報を除いた上で、判別結果を計算することができます。


    プーリング

    抽出した特徴はいくつかの一定の大きさの領域にまとめた後、プーリング と呼ばれる処理でまとめられた領域を1つの値で代表します。画像の空間的な情報を削除し、判別に必要な情報のみを残します。


    分類

    特徴抽出・プーリングの実施後には、事前に用意していたモデルによって画像を判別します。

    また、ディープラーニングに代表される学習手法は特徴抽出・プーリングの処理をひとまとめにして、それらの手順をさらに繰り返すことで認識精度を高めています。


    画像認識技術の4つの活用事例

    文字認識

    画像認識の代表的な活用事例です。文字の書かれた画像から文字の領域を抽出し、どの文字か推測します。この技術で文章読み取りが自動になり、転記作業の負担を軽減します。

    Image recognition

    手書き書類・メモを文字起こししていませんか?社内は紙の書類で溢れていませんか?

    業務を効率化し生産性を向上するためには、紙の情報ををデータ化することが不可欠です。顧客データから自社製品が強い顧客像を割り出したり、売上データから来期の売上予測をしたりと、利益につながるデータの二次活用は勿論、紙の保管場所を削減します。

    画像に写る物体を理解し、それが何かというラベル(正解)を割り当てる過程を 物体認識 と呼びます。


    医療画像認識による診断支援

    医療分野においても画像認識は活用されています。医師が医療画像を見ることで病変を判断する過程を、コンピュータである程度自動化します。最近では医師でさえ見抜けない腫瘍の変異をコンピュータが画像の中の領域を抽出し、判別する事例もあります。これにより、病変時は発見までの時間短縮、診断ミスを低減します。

    医療画像での変異発見は 物体検出 と呼ばれ、画像の中の変異の領域を抽出することを セマンティックセグメンテーションと呼びます。


    インターネット上の画像検索

    インターネット上で画像認識を身近に感じるのは、この 画像検索 だと思います。入力された文字列あるいは画像と類似する画像を検索する技術であり、データベースに保存された画像から似たような画像を検索します。

    Image recognition

    画像検索は具体的な判別を行う インスタンス認識 によってラベル付けをします。あらかじめラベル付けしておくことで瞬時に内容や見た目の近い画像を見つける類似画像検索が可能です。


    自動車の自動運転

    今後、さらに発展が予測される画像認識の活用分野のひとつとして、自動車の自動運転が挙げられます。自動車に搭載されたカメラによって外部の状況を判断し、自動車に運転をさせる技術です。カメラから受け取った画像を認識させることで、人間が難しい操作をすることなく搭載されたコンピュータが運転することが可能になります。

    自動運転では静止した画像だけでなく、その時系列情報も必要です。この時系列情報を利用した画像認識を 動画像認識と呼びます。


    まとめ

    今回はこれらのことをご紹介しました。

    • 画像認識とは何か
    • 画像認識技術の活用事例
    • 画像認識の仕組み


    画像認識は2020年東京オリンピックで採用されたりと、今後浸透していく機械学習の技術です。応用方法の豊富さと進歩の速さがあいまって、「 AI搭載家電」など、急激に導入検討が進んでいます。


    当社はAI・機械学習を活用したソリューションをご提案しています。

    • 自社にあるデータを2次活用したい
    • 画像データを活用したAIを作成したい
    • 既にAIシステムを利用しているが思うような効果が得られていない
    • 機械学習ではなにが出来るのか興味がある


    このようなご相談は画面右上の[お問い合わせ]までご相談ください。


    アクセルユニバースの紹介

    私達はビジョンに『社会生活を豊かにさせるサービスを提供する。』ことを掲げ、このビジョンを通して世界を笑顔にしようと機械学習・深層学習を提案しています。

    • ミッション(存在意義)
      私達は、情報通信技術を使って万物(全ての社会、生物)の暮らしをよりよくすることに貢献し、 それを加速させることを使命とします。

    • ビジョン(目標とする姿)
      社会生活を豊かにさせるサービスを提供する。

    • バリュー(行動規範)

      1. 変化を求め、変化を好み、変化する
      2. 自分の高みを目指してどんどん挑戦する
      3. お客様と一蓮托生でプロジェクトを進める


    acceluniverse


    参考文献

    原田達也(2018) 『画像認識』 講談社

    平井有三(2018) 『はじめてのパターン認識』 森北出版


    Twitter・Facebookで定期的に情報発信しています!

    はじめに

    最近天気が不安定で、急な雨が多くまいっています。(しかも冬の雨はツライ。)
    ついつい出かける時に傘を持たずに、夜、雨に降られることも多いですよね。
    現在、Pythonを使った機械学習を勉強しているので、kaggleだけではなく、実際にテーマを決めて何か簡単な実装をしてみたいと思い、今回は気象庁のデータを使って ある日に雨が降っている or いないという2値の予測を実装をします。
    自分で作ると愛着が湧いて、ちょくちょく予測して傘を忘れずに済むだろう。そして濡れることはもうないだろう!をモチベーションに頑張ります。


    目次


    気象庁のデータを収集し、整える

     予測するためにデータの収集から始めましょう。中々扱いやすいデータが無いので困りますが、気象庁が提供している気象データがかなり綺麗なのでこのデータを採用します。このデータは過去の気象データで地点、期間、項目(雨量、風速など)を選択しエクセルのCSVファイルでダウンロードしてくれるのでとっても便利でした。そこで平均気温(℃)、天気概況(昼:06時~18時)、降水量の合計(mm)、日照時間(時間)、平均風速(m/s)、平均蒸気圧(hPa)、平均湿度(%)、平均雲量(10分比)がかなりを取り、東京の1日毎の1年分のデータを使うことにしました。
     データを読み込んだときにいらない情報もあったのでこんな感じでデータを整えました。

    Alt text
     今回は、ある日に雨が降っているかどうかを予測するので降水量の合計(mm)を正解データ(目的変数)としましょう。雨の定義としては、その日の降水量の合計が0mmより大きい、つまり少しでも降ったら雨、降水量の合計が0mmならば雨でないとします。また特徴量(線形回帰では説明変数などと呼ばれています。機械が学習するために使う要素です。)としては先程あげたデータの降水量の合計以外を使ってみます。天気概況に雨があるので人が雨と判断することは簡単です。しかし、機械は「天気が雨だと降水量が0でない」ということを判断できません。人間にとって簡単なことほど機械が行うのは難しく、天気概況を特徴量に含めた時、どのように学習してくれるか検証することも面白いですね。
     予測するためによく使われているAnacondaのjupyterNotebook、Python3.7を使います。手始めにデータを読み込んで表示させましょう。

    Alt text
     もう少しデータを扱いやすく直します。天気概況ですが、文字情報のため扱いにくいです。そこで「晴」→4、「曇」→3、「雨」→2、「それ以外」(雪など)→1と数値化してしまいましょう。また、正解データになる降水量の合計に関しても降水量があれば1、なければそのまま0にしましょう。

    Alt text
     上のようにデータを整えればOKです。データを整える際はプログラミングがあまり得意でなければそのままエクセルのファイルの数値を1つずつ変えれば問題ないと思います。(データ量が膨大だったらプログラミングを書きましょう。)プログラミングを書いてデータを整えるのもプログラミングの良い練習になると思います。


    線形回帰で実装する

     ここまで来たらついに予測ができます。
     まずは、年月日以外のすべてのデータを説明変数、降水量の合計を目的変数として線形回帰してみましょう。今回はライブラリを使って実装します。

    Alt text
     少し教師あり学習(線形回帰のように正解データがある学習)について説明します。教師あり学習ではデータを訓練用のデータと評価用のデータに分ける必要があります。
     訓練用のデータというのは機械に学習させるための材料になるものです。このデータをもとに機械は学習をします。そしてその学習をしたモデルを用いて評価用のデータを評価します。最後にその評価結果ともともとの正解データを見比べてどれだけあっているかが精度として出るわけです。

     つまり、pythonで実装する際もデータをどれくらいの割合で分けるか機械に指示する必要があります。そのライブラリがIn [9]の2行目「from sklearn.modelselection import traintest_split」です。1行目のライブラリは線形回帰のライブラリになります。
     実装した結果が次のようになりました。

    Alt text
    精度は、0.4781...となっているので約48%。ということはほぼ半分なので全然予測ができていません...。
     せっかく頑張っても最初はこんな感じです。ここで少しだけ上のプログラミングに関して補足します。In [11]の1行目の部分で訓練データと評価用データに分けています。今回は、「 test_size = 0.2」としているので全データに対して訓練データが80%、評価用データが20%としています。このデータは訓練データ、評価用データのどちらに割り振られるかランダムなので評価するごとに同じ結果は出ません。振り分けられ方によっては精度が上下することもあるので、正確な精度を出したいときは何回か実装してその平均を取ります。

    実装結果から精度UPするために

     線形回帰をした時、精度が約52%でした。この精度になった原因としては以下が考えられます。

    ①過学習してしまった。
    ②データが少ない。
    ③2値に分類するのにそもそも線形回帰の相性が悪い。

    以上3点が思いつきました。順番に見ていきましょう。
     まず①について、そもそも過学習というのは説明変数の相性が悪かったり説明変数が多すぎて機械が誤って学習してしまうことです。誤って学習してしまうことで、精度が悪くなってしまいます。そこで、説明変数を見直しましょう。例えば、日照時間は長ければ、気温が高くなりそうのなので気温のデータだけあれば大丈夫そうです。また、平均蒸気圧は気温に依存して決まるそうなのでこれもいらなそうです。そこで日照時間と平均蒸気圧をなくして予測してみましょう。その結果は、

    Alt text

    精度は、0.5585...なので多少上がりました。


     次に②については、データが少ないと機械もうまく学習することができません。1年分のデータから3年分のデータに増やして実装してみました。

    Alt text

    ①の説明変数も減らして実装したのですが精度はほぼ変わらなかったですね。
     最後に③についてです。線形回帰は最小2乗法を用いた最もシンプルな回帰モデルですが、今回の精度の結果からあまり2値に分類するのには適したモデルではないのかもしません。そこで、2値分類する際に有名なモデルとして、ナイーブベイズやロジステック回帰です。ロジステック回帰にして実装してみましょう。

    Alt text
    これも①の説明変数も減らして実装すると、精度はすごく上がりました。
    皆さんもいろいろ実験してみてください。

    まとめ

     今回は、線形回帰を用いて雨が降るかどうかを予測しました。先程の精度UPについて考察する所では、以下のようにして精度を上げることができました。

    • 特徴量(説明変数)をうまく選ぶ

    • モデルを変えてみる

     他にもデータを見直し、もっと学習に合うようにデータを直して精度を上げます。このような作業をデータの 前処理(特徴量を選択するのも前処理です)と言います。前処理は知識やセンスが問われ、うまくできると精度がとても上がります。そして、人によってやり方も様々なので正解もありません。この精度を競うコンペも行われていて、有名所はkaggleSIGNATEがあります。コンペで優秀な成績を納めれば懸賞金も貰えるのでチャレンジしてみて下さい!

    参考文献

    気象庁

    Anaconda

    kaggle

    SIGNATE


    定期的にメルマガでも情報配信をしています。
    ご希望の方は問い合わせページに「メルマガ登録希望」とご連絡ください。

    このアーカイブについて

    このページには、過去に書かれた記事のうち利用事例カテゴリに属しているものが含まれています。

    前のカテゴリは論文解説です。

    次のカテゴリは回帰です。

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