忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【DS検定対策】「中身」で勝負!コンテンツベースフィルタリングの仕組み

「この映画のアクションシーンが好きなら、こっちのアクション映画もどう?」アイテムの特徴そのものに注目するのが、コンテンツベースフィルタリングです。

1. 【 問題 】

レコメンドシステムにおいて、アイテムのジャンル、テキスト説明、メタデータなどの属性情報を分析し、ユーザーが過去に好んだアイテムと特徴が類似したアイテムを推薦する手法を何と呼ぶでしょうか?

① 協調フィルタリング
② 内容ベース(コンテンツベース)フィルタリング
③ 相関分析
④ クラスター分析


2. 【 解答 】

正解: ② 内容ベース(コンテンツベース)フィルタリング

3. 整理:アイテムの「プロフィール」を比較する

この手法では、まず各アイテムを「特徴ベクトル」として表現します。

【 コンテンツベースの流れ 】

[ 1. アイテムの属性抽出 ]
映画A:[ジャンル:SF, 監督:〇〇, 主演:△△]
映画B:[ジャンル:SF, 監督:××, 主演:△△]

[ 2. ユーザープロファイルの作成 ]
ユーザーが過去に見た映画から、「この人は『SF』と『主演:△△』を好む」という傾向を数値化する。

[ 3. 類似度の計算 ]
ユーザーの好みと、未視聴のアイテムの「属性」がどれだけ近いかを計算し、高い順に勧める。

--------------------------

メリット: 他のユーザーのデータが不要なため、新商品(誰も買っていないもの)でも特徴さえ分かればレコメンド可能です!

4. 協調フィルタリングとの比較(ここが試験に出る!)

手法注目するデータ新商品への対応
協調 他人の購入履歴 苦手(データがないため)
コンテンツ アイテムの属性 得意(属性で判断できる)

5. DS検定形式:実戦4択クイズ

問:コンテンツベースフィルタリングの弱点として、ユーザーの過去の好みに似たものばかりが選ばれ、意外性のある提案ができなくなる現象を何と呼ぶか。

① コールドスタート問題   ② オーバーフィッティング   ③ フィルターバブル   ④ 勾配消失

【 正解: ③ 】

解説: 自分の好きなジャンルばかりに囲まれてしまい、新しいジャンルに出会えなくなることを「フィルターバブル(またはセレンディピティの欠如)」と呼びます。


6. まとめ

DS検定において「アイテムの属性」「特徴の類似」というキーワードが出たら「コンテンツベース」です。協調フィルタリングが「他人の行動」を見るのに対し、こちらは「アイテムの中身」を見る、という違いを明確にしておきましょう!


PR

【DS検定対策】好みを予測する!「協調フィルタリング」の仕組み

「自分と好みが似ているあの人が買ったなら、私も好きかも」。そんな直感を計算式に落とし込んだのが協調フィルタリングです。

1. 【 問題 】

レコメンドシステムにおいて、多くのユーザーの行動履歴(購入、閲覧、評価など)を蓄積し、対象ユーザーと行動パターンが似ている他のユーザーのデータを用いて商品を推奨する手法を何と呼ぶでしょうか?

① コンテンツベースフィルタリング
② 協調フィルタリング
③ 決定木分析
④ 主成分分析


2. 【 解答 】

正解: ② 協調フィルタリング

3. 整理:2つの主要なアプローチ

協調フィルタリングには、何を基準に「似ている」と判定するかで2つの形式があります。

【 協調フィルタリングの分類 】

[ 1. ユーザーベース ]
あなたと「購買履歴が似ているAさん」を探し、Aさんが買ってあなたがまだ買っていないものを勧める。

[ 2. アイテムベース ]
商品Aを買った人は商品Bも買う傾向がある場合、商品Aを買ったあなたに商品Bを勧める。

--------------------------

特徴: 商品の中身(色や形、スペック)を知らなくても、ユーザーの「行動」さえあればレコメンドできるのが強みです。

4. 覚えておくべき課題「コールドスタート」

協調フィルタリングには最大の弱点があります。それは、「データが少ない新規ユーザーや新商品にはレコメンドができない」という点です。これを「コールドスタート問題」と呼び、DS検定の頻出キーワードとなっています。


5. DS検定形式:実戦4択クイズ

問:ユーザーの属性や商品の特徴(色、ジャンル、テキスト説明など)そのものを分析してレコメンドを行う、協調フィルタリングとは異なる手法はどれか。

① ユーザーベース法   ② アイテムベース法   ③ 内容ベース(コンテンツベース)フィルタリング   ④ 行列分解法

【 正解: ③ 】

解説: 「好みが似ている人」ではなく「商品そのものの特徴」に注目するのが内容ベース(コンテンツベース)です。両者を組み合わせた「ハイブリッド型」も実務ではよく使われます。


6. まとめ

DS検定において「ユーザーの行動履歴」「似たユーザーのパターン」という記述が出たら「協調フィルタリング」です。新米ユーザーには効かない「コールドスタート問題」とセットで覚えておきましょう!


【DS検定対策】AIの「知識の源」!コーパス(Corpus)の重要性

AIが言葉を理解し、生成するためには、お手本となる膨大な文章データが必要です。単なるテキストの集まりを超えた「コーパス」の役割を学びましょう。

1. 【 問題 】

自然言語処理において、言語の法則や構造を抽出するために、実際の言語使用例を大量に集め、検索や分析ができるように構造化したデータベースを何と呼ぶでしょうか?

① 形態素
② コーパス(Corpus)
③ オントロジー
④ シソーラス


2. 【 解答 】

正解: ② コーパス(Corpus)

3. 整理:ただの「文章」と「コーパス」の違い

インターネット上の文章をただ集めただけでは、質の高いAIは育ちません。コーパスには「構造化」という重要な工程が含まれます。

【 コーパスを構成する要素 】

[ 1. 生テキスト(Raw Text) ]
小説、ニュース、SNS、論文など、実際に使われている文章。

[ 2. アノテーション(メタデータ) ]
★ ここが重要!
単語ごとに「品詞情報」を付与したり、文の「感情スコア」を付けたりして、コンピュータが処理しやすい情報を付け加えること。

--------------------------

代表的なコーパス:
・現代日本語書き言葉均衡コーパス(BCCWJ)
・Wikipediaのダンプデータ
・青空文庫のテキストデータ

4. コーパスの活用シーン

1. 辞書・文法作成: 言葉の使われ方を統計的に分析し、より自然な文法モデルを作ります。
2. LLMの学習: ChatGPTなどの大規模言語モデルも、Web上の巨大なコーパスを学習することで言語能力を獲得しています。
3. 翻訳精度向上: 対訳コーパス(日本語と英語が対になったデータ)により、翻訳AIを強化します。


5. DS検定形式:実戦4択クイズ

問:コーパスに品詞情報などの付随情報を追加する作業を一般に何と呼ぶか。

① クレンジング   ② アノテーション   ③ スクレイピング   ④ トークン化

【 正解: ② 】

解説: データに対して「ラベル」や「注釈」を付ける作業をアノテーションと呼びます。コーパスの価値は、このアノテーションの質と量で決まると言っても過言ではありません。


6. まとめ

DS検定において「言語を構造化したデータベース」「大量の使用例」という表現が出たら「コーパス」です。データベースエンジニアとしても、非構造化データを構造化データに変える「情報の宝庫」として覚えておきたい用語ですね!

【Kaggle挑戦記】Digit Recognizer:画像認識にLightGBMで挑む

S4E11の「名前(Name)」というノイズとの戦いを経て、今回は心機一転、画像認識の登竜門である「Digit Recognizer(手書き数字認識)」に挑戦しました。 画像認識といえばディープラーニング(CNN)が定石ですが、まずは慣れ親しんだLightGBMで「どこまで通用するか」をデバッグします。

1. 戦略:画像を「784個の変数」と見なす

28x28ピクセルの画像データを、意味を持つ「形」として捉えるのではなく、0から255の数値が入った784個のカラムとして扱います。 Macのローカル環境(ターミナル)にて、以下の多クラス分類(0〜9)用パラメータで実行しました。

params = {
    'objective': 'multiclass',
    'num_class': 10,
    'metric': 'multi_logloss',
    'verbosity': -1,
    'boosting_type': 'gbdt',
    'learning_rate': 0.1
}

2. 実行結果:Macターミナルのログ

学習はスムーズに進み、検証データにおいて非常に高い精度をマークしました。

Training until validation scores don't improve for 50 rounds
Did not meet early stopping. Best iteration is:
[100] valid_0's multi_logloss: 0.0857917

--- Validation Accuracy: 0.97417 ---
--- Submission file created: submission_digit_lgb.csv ---

3. リーダーボードの結果

Kaggleへ提出した結果、最終的な正解率は以下の通りとなりました。

正解率:0.97139

画像認識の専用モデルを使わずとも、約97.1%という精度を叩き出すことができました。 これは「ピクセルごとの輝度値」だけでも、数字の特徴を捉えるには十分な情報量が含まれていることを示唆しています。

4. 考察:エンジニアとしての気づき

前回のS4E11では「データの中身(Name)を疑う」ことが鍵でしたが、今回は「純粋な数値のパターン」が勝負でした。

  • 特徴量の多さ: 784個の変数を同時に扱う負荷も、Macのローカル環境で軽快に処理できました。
  • 多クラス分類の挙動: 0か1かの二値分類とは異なり、10種類の確率を計算する「multiclass」の動きをログから確認できたのは収穫です。

97%を超えたここから先は、CNNを導入して「形や線のつながり」を学習させる領域になります。 しかし、エンジニアの「手癖」としてのLightGBMが、画像認識においてもここまで強力なベースラインになることを確認できた、実りある修行となりました。


次なる実戦「Playground Series S4E12」の開始、あるいは地質予測の新コンペへの参戦に向け、 この「数値の羅列をねじ伏せる感覚」を研ぎ澄ませておきたいと思います。



【Kaggle挑戦記】S4E11 #2:ノイズを削って精度を出す。名前(Name)削除の劇的ビフォーアフター

前回、予測の重要度ランキングで「Name(名前)」が1位という、エンジニアとして看過できない「仕様バグ」に近い状態に直面しました。 今回はこの不適切な依存関係を排除し、コードをリファクタリングして再挑戦した結果を報告します。

1. 実装:不要な依存関係を排除した「クリーン」なモデル

「名前で予測する」というハードコーディングに近い過学習を防ぐため、物理的にカラムをドロップしました。 また、コンペの締め切り後(After Deadline)でも確実に評価を通すため、型変換と出力を最適化した「修正版コード」を投入しました。

import pandas as pd
import lightgbm as lgb
from sklearn.preprocessing import LabelEncoder

# 1. データの読み込み
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

# 2. 前処理:ターゲットの数値化
le = LabelEncoder()
if train['Depression'].dtype == 'object':
    train['Depression'] = le.fit_transform(train['Depression'])

# 3. 特徴量の選択(「名前」を明示的にドロップ!)
drop_cols = ['id', 'Name']
X = train.drop(drop_cols + ['Depression'], axis=1)
y = train['Depression']
X_test = test.drop(drop_cols, axis=1)

# 4. カテゴリ変数の処理(LightGBM用)
cat_cols = X.select_dtypes(include=['object']).columns.tolist()
for col in cat_cols:
    X[col] = X[col].astype('category')
    X_test[col] = X_test[col].astype('category')

# 5. モデルの構築
params = {
    'objective': 'binary',
    'metric': 'binary_error',
    'verbosity': -1,
    'random_state': 42
}

model = lgb.LGBMClassifier(**params)
model.fit(X, y)

# 6. 予測と提出ファイルの作成
submission = pd.DataFrame({
    'id': test['id'],
    'Depression': model.predict(X_test)
})
submission['Depression'] = submission['Depression'].astype(int)
submission.to_csv('submission_final.csv', index=False)

2. コンソール出力:健全なランキングへの変遷

実行後、コンソールに表示されたランキングは、前回とは全く異なる「納得感」のある顔ぶれになりました。 可読性のために標準的なログスタイルで出力結果を記載します。

--- Submission file created successfully! ---
            feature  importance
2             City          494
12            Degree          388
4          Profession          359
1                Age          315
15  Financial Stress          224

3. スコア:ノイズを消して「実力」が向上

締め切り後(After Deadline)のLate Submissionですが、結果は意外なものでした。 名前を消したことで、むしろスコアが上昇したのです。

指標前回(Nameあり)今回(Nameなし)
Public Score 0.94008 0.94152 (↑)
Private Score 0.93868 0.93961 (↑)

4. 考察とまとめ

「名前」という強力なノイズがモデルを惑わせていたことが、スコアの向上によって証明されました。 不要なカラムを削除したことで、モデルが「City(都市)」や「Degree(学位)」といった、メンタルヘルスに真に影響を与えるコンテキストに集中できるようになった結果です。

「なぜ動くか分からないコード」を放置せず、違和感のある変数を削ぎ落とす。 バックエンドのデバッグと同じ姿勢で取り組むことが、Kaggleにおける精度向上にも直結することを実感した一戦でした。


Kaggleの履歴に「After Deadline」と「Error」のログが残ることは、試行錯誤の証。 次の「本物のコンペ」では、このデバッグの知見を最初からぶつけていきたいと思います。