iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

AIを感じてみる

はじめに

こんにちは! 株式会社iimonでエンジニアをしているひがです!
最近AIを活用しよう!という風潮が流れていてエンジニアとしても社会人としてもAIを使いこなすことが求められてるように感じます。 そんな中、AIってそもそも何でしたっけ?という疑問を持たれる方も多い気がしたので(筆者もその一人です)今回はAIについて整理して実際モデルを構築したりしてなんとなくAIを感じてみようと思います。
データサイエンスよりのお話も結構あるかもですが、気軽に聞き流していただけると嬉しいです。

そもそもAIって何?

AIは「Artificial Intelligence」の略で、文字通り人工的な知能という意味を指します。歴史は意外にも古く、最初に1956年のダートマス会議で「人間の知能を機械によって模倣し、機械が人間のように思考や問題解決を行えるようにする」という、AIの概念が公開されたようです。(筆者はまだ生まれてません) ちなみに、時代の流れと共にAIにも流行りや廃り(冬の時代)などもあるみたいですが、本記事では特に触れませんが、興味がある方は調べてみると面白いかもです。

機械学習について

AIについて調べていると機械学習(Machine Learning、以下ML)というワードをよく見かけるかもしれません。
MLとAIはよく混同されますが、ML自体はあくまでAIを実現するための手段の一つであり、コンピュータに大量のデータ(ビッグデータ)を読み込ませ、アルゴリズムを用いて分析させる手法のことです。機械にデータを読み込ませ分析させる中で特定のパターンを記憶(学習)させ、新しいデータが来たときに機械自身が過去の学習をもとに予測(出力)し、色々な課題を解決することに利用されます。(いかにも人の手で作り上げる知能という感じですね!) ちなみに、学習する機械のことを学習器とかモデルとか呼んだりします。
また、AIやMLと一緒にディープラーニング(深層学習)という言葉もよく見かけるかもしれません。ディープラーニング自体はあくまで機械学習の一部で、主にニューラルネットワークというアルゴリズム誤差逆伝播法などの技術を用いてより詳細な分析を可能とする手法になります。ディープラーニングの登場により画像分析や音声認識、大規模言語開発(Large Language Models、以下LLM)など複雑な分析を必要とする分野で大きな発展が見られ、現在のビジネスにおいても様々なシーンで活用されています。

機械学習の種類について

ここからは機械学習の詳細についてもう少し踏み込んでみていきましょう。
機械学習は大きく分けて教師あり学習教師なし学習強化学習の3つの手法があります。

教師あり学習

教師あり学習とは入力データに正解(ラベル)を与えてモデルを学習させる手法です。ラベルのことを目的変数、ラベル以外の情報を説明変数と言ったりもします。例えば過去家を購入した人のデータから家を買う人の特徴(年収、年齢、家族構成、家の値段、家の周辺環境…etc)を学習させ、どういう人がどういう家を買いやすいかを予測できるモデルを構築したりします。この例の場合、家の購入有無がラベルで年収や年齢や家族構成などの情報が説明変数となります。
メリット:
・ラベルを与えることで予測の精度を上げ、応用も効かせやすくなる
アルゴリズムも様々なものがあるので、目的に応じて柔軟に選択できる(アルゴリズムについては後続で確認していきましょう)
デメリット:
・データの準備とラベリング(正解をつける作業)が大変
完全に自動化することは難しいとされることが多く、どうしても人の手が入ってしまうので、その点で苦労することは多いかもしれません。

教師なし学習

教師なし学習教師あり学習とは反対にラベルを持たない学習手法で、ランダムなデータの中から特定のパターンやグループを見つけたりします。例えば購買履歴や行動データから顧客を類似のグループに分けたりすることでマーケティングに活用したりします。
メリット:
・ラベリングを必要としないので、学習にかかるコスト(人の労力)が少なく済む
・機械が出した答えに以外な発見があることもある
デメリット:
・予測精度があまり高くないことも多い(ラベルを与えていないので)
アルゴリズム教師あり学習に比べると現時点ではあまり多くありません。

強化学習

強化学習は機械に「報酬」を与え、機械が報酬を最大化するように学習させる手法です。報酬はラベルとは違い減ったり増えたりするので、機械も環境に応じてどうすれば報酬が最大になるかを試行錯誤しながら学習していくことになります。具体的な例では囲碁などの戦略ゲームがあり、状況(環境)が変わる中で長期的に見てどうすれば勝てるか(報酬を最大化できるか)を試行錯誤させながら対戦してもらいます。(有名なものではAlphaGoなどがあります)
メリット:
・処理スピードが早く精度の高い学習が期待できる
・経験を積むごとに精度も向上し、人がわからない因果関係も見抜くことができる
デメリット
・偏りのない良質なデータを用意する必要がある
ブラックボックスになる(なぜその答えを出したかわからなってしまう)ことが多々ある
特に良質なデータを揃える(環境を整えてあげる)ことはどうしても人の労力がかかってしまうので、教師あり学習と同様かそれ以上に最初の準備が大変かもしれません。

モデルができるまで

ざっくり機械学習の種類を確認できたので、次はモデルができる過程を見ていきましょう。
今回はアルゴリズムも豊富な教師あり学習をメインに見ていきます。

分類と回帰について

教師あり学習の中でも大きくわけて分類と回帰という分析手法があります。
分類は与えられたデータがどのカテゴリに属するかを予測します。一方、回帰は与えられたデータから具体的な数値や確率などを予測します。
下記は分類と回帰の例になります。
分類の例)
入力:家の広さ、築年数、部屋数など
予測:「優良」 or 「劣悪」
※2値分類の例ですが、3つ以上のカテゴリで分けることも多々あります
回帰の例)
入力:家の広さ、築年数、部屋数など
予測:家賃の値
分析したい対象や目的に応じて、分類か回帰のモデルを使い分ける必要があります。

訓練データとテストデータについて

データが与えられていざモデルに学習させようとした際に、すべてのデータをモデルの学習に使ってしまうとそのモデルがちゃんと学習できているのか評価できなくなってしまいます。そこで、教師あり学習をさせる場合はモデルの学習に使うデータとモデルがちゃんと学習できているかを評価するために使うデータに分けることがよくあり、学習に使うデータを訓練データ、評価に使うデータをテストデータと呼んだりします。
訓練データとテストデータの分け方としては、モデルのをより賢くしたい(精度を上げたい)ので訓練データを多めになることが多いです。 (訓練データ:テストデータ=7:3や8:2とかが多いですかね)
ただ、データの量や質によっては、この後説明する過学習などを考慮して配分を調整したりもします。

過学習と学習不足について

モデルが与えられたデータに対して過剰に学習してしまう状態を過学習(over fitting)、逆に学習しきれていない状態を学習不足(under fitting)と言います。 学習不足は純粋にデータの特徴を捉えきれていない状態で、テストするときの予測精度が低いものとなります。一方、過学習ではテスト時の予測精度は高いのでちゃんと学習できていそうと感じるものの、新しいデータで予測させると著しく予測精度が低い状態となります。(偏った学習とも呼ばれたりします)
過学習や学習不足が起きる原因や対策は下記のようなものがあります。
⚪︎過学習
原因:
・訓練データが少なく、特定の特徴やノイズに過剰に反応する
・モデルが複雑すぎて細かいところまで過剰に覚えてしまう
対策:
・純粋に訓練データを増やす
・モデルのハイパーパラメータを調整して複雑度を良い感じに調整する
※モデルには学習率やエポック数(学習の反復回数)などのパラメータを調整できるものがあり、それらのパラメータをハイパーパラメータと呼んだりします
※学習が見込めなくなった時に学習を早めに止める設定を入れる(アーリーストッピングと呼ばれます)ことも有効です
・色々なパターンのデータで学習させる
※特に訓練データとテストデータを入れ替えて複数の組み合わせで検証する手法をクロスバリデーションと呼んだりします
⚪︎学習不足
原因
・データが少なかったり、単純すぎて特徴があまりない
・モデルが単純すぎて特徴を捉えきれていない
・訓練回数が足りない
対策
・データを特徴的なものに加工する
※既存のデータを組み合わせて特徴的なデータを作ったり学習しやすいデータに変換したりすることを特徴量エンジニアリングと呼んだりします
・ハイパーパラメータを調整して複雑度を良い感じに調整する
昨今のモデルは高性能なものが多いので、簡単に過学習に陥ったりします。みなさんも気をつけましょう。

評価指標について

モデルが学習できているかを測る指標として、様々な評価指標が存在します。どのように評価するかによって学習の仕方や内容も変わってくるので、とても大事な指標です。下記で簡単に見ていきましょう。

⚪︎分類の評価指標
・混同行列:
2値分類の時によく使われる指標。例えば病気の陽性・陰性を予測するときに

予測:陽性、実測:陽性(True Positive、TP)
予測:陰性、実測:陽性(False Negative、FN)
予測:陽性、実測:陰性(False Positive、FP)
予測:陰性、実測:陰性(True Negative、TN)

という状態が起きえます。これをマトリクスとして表したものを混同行列と言います。
この混同行列を利用した評価指標が考案されていますので、以下で見ていきましょう。
・正解率(Accuracy)
一番単純でイメージしやすい指標で、全データの中で正しく予測できたものの割合を示します。
式にすると下記の感じです。

TP + TN / TP + TN + FP + FN

ただ、Positive、Negativeに偏りがあるとあまり機能しなくなるという弱点があります。
・適合率(Precision)
こちらはPositiveと予測した時に実際にPositiveだったときの割合を示します。
式にすると下記の感じです。

TP / TP + FP

ちなみに、適合率が高い状態を精度が高いと表現したりします。
ただ、こちらはPositive or Negativeどちらかの情報を落とすことになってしまうという弱点があります。
・再現率(Recall)
こちらはPositiveとNegativeの情報を落とすことなくPositiveなデータをPositiveと予測できているかを示す指標です。
式にすると下記の感じです。

TP / TP + FN

ちなみに、再現率が高い状態を感度が高いと表現したりします。
感度も精度も高いモデルが理想ではありますが、この二つはトレードオフの関係にあるので、どうしてもどちらかが犠牲になってしまうことが多々あります。
・F1スコア
感度も精度も高い状態を考慮した指標がF1スコアです。
式にすると下記の感じです。

2 × (精度 × 感度) / (精度 + 感度)

これは精度と感度の調和平均を表しており、どちらも完璧な場合は1を、どちらかが0の場合は0を示すことになります。
2値分類の評価指標でとても有効です。
その他にもROC曲線とAUCなど分類に関する指標が色々あるので、気になる方はぜひ調べてみてください。

⚪︎回帰モデルの評価指標
・平均二乗誤差(MSE:Mean Squared Error)
各データに対する予測値と実測値の差分(残差ともいいます)を二乗して平均化した指標。
シンプルでわかりやすいので、色々な場面で利用されます。
・平均絶対誤差(MAE:Mean Absolute Error)
残差の絶対値を平均化した指標。残差が二乗されていない分、ハズレ値(極端な値)の影響を受けにくい特徴があります。
・平均二乗偏差(RMSE:Root Mean Squared Error)
二乗平均の平方根を取った指標。二乗して平方根を取ることで学習データの単位と合わせることができます。
こちらの値が小さいほど、精度の良いモデルであると言えます。
その他にも決定計数など回帰に関する指標が色々あるので、気になる方はぜひ調べてみてください。

モデルの種類について

教師あり学習で用いられるモデルにも様々な種類があるので、有名どころを簡単にみていきましょう。
・線形単回帰
1つの説明変数によって1つの目的変数を予測する手法。
式にすると下記の感じです。

y = ax + b
(y:目的変数、x:説明変数、a:重み、b:切片)

グラフにすると直線上になることから、そのような名がついています。
・重回帰
こちらは1つの目的変数に対して複数の説明変数がある手法です。
式にすると下記の感じです。

y = a1x1 + a2x2 + … + b
(y:目的変数、xn:説明変数、an:重み、b:切片)

複数の説明変数を持つことでより実用的な分析に利用できますが、説明変数のそれぞれの重要度や相関関係など色々考慮するものが増えます。
・ロジスティック回帰
ロジスティック回帰は複数の説明変数からある事象が起こる確率(目的変数)を予測します。
式で表すにはシグモイド関数やソフトマックス関数など複雑な関数の理解が必要になるため、ここでは割愛します。
名前に回帰とついていますが、その特性から分類を扱うアルゴリズムなので気をつけてください。
ちなみに、シグモイド関数だと2値分類、ソフトマックス関数だと多値分類に対応できます。
・決定木
決定木は学習データの各属性の条件分岐を繰り返して目的に到達するアルゴリズムです。目的変数がカテゴリの場合は分類木、数値の場合は回帰木と呼ばれたりします。また、その名の通り構造が木のようになっていて、先端の方を葉と表現したりします。
一般的に条件分岐が増えたり深くなったりすると複雑なモデルとなります。精度はあがりますが、過学習も起こしやすくなったりするので、データに合わせたパラメータのチューニングが大事です。
・ランダムフォレスト
複数の決定木の出力結果を組み合わせて一つの結果を導き出します。
単体の決定木よりも高い精度で結果を出力してくれます。
後続で説明しますが、アンサンブルと呼ばれる手法の一つに当てはまります。
ニューラルネットワーク
ニューラルネットワークは脳の神経細胞ニューロン)を模倣したアルゴリズムです。
入力層、隠れ層、出力層の3つにわかれており、入力層からインプットされるデータに重みをつけて隠れ層へ渡します。
隠れ層の中では受け取った値と重みをもとに活性化関数を使って予測値を計算し出力層へ渡すというような流れで学習が進みます。
ニューラルネットワークの隠れ層を複数重ねることでより複雑な学習が可能となり、誤差逆伝播法などのアルゴリズムと組み合わせることでより精度の高いモデル(ディープラーニング)ができあがり、様々な場面で活躍してきました。

アンサンブルについて

複数のモデルを組み合わせて精度の高い出力を実現する手法をアンサンブルと言います。
アンサンブルにもいくつか種類があり、主にバギング、ブースティング、スタッキングが有名です。
・バギング
同じアルゴリズムを持った複数のモデルを学習させ、それらの結果の平均や多数決を取って出力する手法です。
例としてはランダムフォレストが挙げられ、名前の由来としてBootstrap Aggregatingの略でバギングとなっている。
・ブースティング
複数の弱いモデル(精度の低いモデル)を順番に学習させ強いモデル(精度の高いモデル)にしていく手法です。
前の学習で間違えた箇所を修正して次の学習に活かしていくことで、最終的に強いモデルが出来上がります。
間違えた箇所の修正はモデルの重み付けを調整することで実現していきます。Microsoftが提供するXGBoostやLightGBMなどが有名です。
・スタッキング
スタッキングは複数の異なるアルゴリズムの予測結果を収集してそこからメタモデルとして最終的な予測結果を出力する手法です。
精度は高くなる傾向にありますが、結構ブラックボックスの要素も増えるので注意が必要です。

分類と回帰をやってみる

以上を踏まえて、分類と回帰を実際に体験していきましょう。
機械学習のモデル構築やデータ分析にはよくJupyter NotebookというPythonR言語の実行環境が使われますが、今回はDockerでjupyter/base-notebookというイメージをベースにコンテナを立てて、ブラウザから処理の流れを追っていきましょう。
また、今回は下記のPythonライブラリも使用します。

matplotlib:2Dや3Dのグラフを描画するライブラリ
scikit-learn:データ分析や機械学習に必要な機能が詰まったライブラリ
pandas:データ解析を行いやすくするライブラリ
lightgbm:マイクロソフトが開発した軽量で高性能なlightgbmを使うためのライブラリ

ソースコードは下記から取得できます。
github.com

まずはDockerを立ち上げ、Notebookをブラウザで開きます。
docker compose up

(ホストは8888にしてます)

ブラウザで見てみると、うまくJupyter Notebookのホーム画面が表示されてますね!

今回は事前に分類と回帰のipynbファイルを用意しているので、そちらから見ていきましょう。
まず分類ですが、最初にpandasとsklearnのデータセットを読み込みます。

ちなみに、sklearnにはあらかじめ分析用のデータが用意されており、分類ではワインのデータを使うこととします。
dfという変数はDataFrameの略を示しており、DataFrameはpandasが提供するデータ操作に特化した機能です。
試しにheadメソッドを使ってみると、読み込んだワインのデータが先頭から5件分表示されています。(表示する行数もしていできますが、デフォルト5件です)

infoメソッドを使うと、全カラムに関する情報が表示されます。(アルコール度数や色合いなどの情報がありますね)

ちなみに、今回は全データ欠損なし(non-null)で数値となっているのでデータクレンジングなどは特にしなくても分析できますが、一般的な生データだとそこまで綺麗ではないので、前処理しないと分析すらできない状態になったりします。
次にdescribeメソッドですが、こちらはデータ数や平均値、中央値、最小値などの情報を一覧化してくれます。

アルコール13度くらいが多そうですね!
histメソッドではサイズなどを指定して各項目のヒストグラムを表示してくれます。

データをグラフで可視化することで、色々な特徴の発見に繋がったりします。

ここからいよいよモデルの学習に入っていきましょう。
今回はワインの多クラス分類(3分類)なので、目的変数と説明変数を分けて、それぞれの訓練データとテストデータに分割します。(8:2にしています) モデルはロジスティック回帰とLightGBMを使ってみましょう。

ロジスティック回帰はmax_iter(学習の反復回数)を指定しています。(デフォルトは100ですが、それだと学習が回りきっていないとワーニングが表示されてしまったので。。)
LightGBMの方は今回3クラスの分類という情報をパラメータで渡して、他のパラメータはデフォルトでやってみます。
モデルを学習(fit)させ、テストしてみると、どちらのモデルもaccuracyで1となりました!(全問正解です)

今回はデータ量がそこまで多くなく、かつきれいなデータだったので、学習も早く高い精度が出ました。
本番のデータはもっと大量で汚いことが多いので、必要に応じてデータクレンジングや特徴量エンジニアリングをしてモデルを学習させていきます。

次に回帰の分析も見てみましょう。
回帰ではsklearnのカリフォルニア住宅価格のデータセットを使い、住宅関連の情報から価格を予測できるようにモデルを構築していきます。

基本的に流れは分類のときと同じです。(corrメソッドで各項目同士の相関関係が見えたりします)

ただ、ヒストグラムを見てみると、回帰の場合は築年数(HouseAge)とPrice(価格)で異常に飛び抜けたデータが存在します。

このようなデータをハズレ値などといったりしますが、それを学習すると著しく精度が下がってしまったりするので、今回は除去しましょう。

ここからモデルの学習に入っていきます。
回帰の方は住宅価格の予測なので、まずは説明変数と目的変数に分けて、それぞれの訓練データとテストデータに分割します。(こちらも8:2にしています) 学習させるモデルは線形回帰とニューラルネットワークを使ってみましょう。

線形回帰とニューラルネットワークのパラメータもデフォルトのまま学習させテストしてみると、ニューラルネットワークの方がより良い予測結果となりました。(評価指標にRMSEを使っているので、数値が低い方が精度が高いことを示します)

ちなみに、ニューラルネットワークは隠れ層を増やすだけでも精度があがったりしますが、過学習にもなりやすいのでアーリーストッピングと一緒に使うことがおすすめです。
最後に予測値と実測値をプロットしてみましょう。

なんとなく右肩上がりでデータが点在していますね。また、ニューラルネットワークの方がデータのばらつきがなくコンパクトに右肩上がりになっているので、RMSEで考えると予測の精度が高いことがみて取れます。
以上、簡単に分類と回帰のモデルの構築工程をみていきましたが、まだまだ分析の余地はたくさんあるので、興味がありましたら色々なデータやモデルで遊んでみると面白いかもです。

最後に、LLMについて少しだけ触れておきます。
LLMの前段として、これまで自然言語を処理するAI(以下、言語AI)の発展には様々な歴史がありました。
Bag-of Wordsによるテキストのトークン化・ベクトル表現、Word2vecによる単語間の関係の学習・埋め込み、RNNの活用しての入力文のエンコードと新しい文章へのデコーディング、そこから注意機構に基づいたTransformerという新しいネットワークアーキテクチャの登場により一気にLLMは脅威的な能力を得ました。ただ、Transformerは翻訳などには適していますがテキストの分類などは苦手なので、そこを補うようにBERTという新しいアーキテクチャが登場し、そこからGPT(Generative Pre-trained Transformer)が生まれ、2023年ころから一気に生成AIが普及しました。 現在も生成AIは進化を続けて、おそらく今後はそれらのモデルの使い方で働き方も変わってくるかもしれませんが、その背景となる技術や歴史を知っておくのもどこかで役に立つかもしれませんね!

ということで、本日はAIを感じてみました。

さいごに

現在弊社ではエンジニアを募集しています!
この記事を読んで少しでも興味を持ってくださった方は、ぜひカジュアル面談でお話ししましょう!

iimon採用サイト / Wantedly / Green

【参考サイト、技術本】
https://scikit-learn.org/stable/
東京大学のデータサイエンティスト育成講座
直感LLM