<?xml version="1.0" encoding="UTF-8" ?>
<feed xml:lang="ja" xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:thr="http://purl.org/syndication/thread/1.0">
  <title type="text">いけいけ機械学習</title>
  <subtitle type="html">統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。</subtitle>
  <link rel="self" type="application/atom+xml" href="https://learnms.blog.shinobi.jp/atom"/>
  <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/"/>
  <updated>2015-10-10T06:20:17+09:00</updated>
  <author><name>吟遊詩人</name></author>
  <generator uri="//www.ninja.co.jp/blog/" version="0.9">忍者ブログ</generator>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" />
  <entry>
    <id>learnms.blog.shinobi.jp://entry/241</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/241/" />
    <published>2026-09-23T18:29:47+09:00</published> 
    <updated>2026-09-23T18:29:47+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】TPS Feb 2022：1.1万行の「重複データの罠」を破り、本番LBスコアを更新！</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>前回の検証では、手動での特徴量生成を行わずに素のデータをLightGBMへ投入した結果、<b>手元CVが0.99553（約99.5%）</b>という異次元の高精度を記録した一方で、<b>Kaggle本番のLeaderboard（LB）では0.93937</b>まで急降下するという大きなスコアギャップに直面しました。</p>
<p>今回は、この乖離の原因である<b>「データ重複によるリーク（過学習）」</b>を解消し、正しく検証環境を再構築してLBスコアの更新に挑みました。</p>
<h3 style="color: blue;">1. なぜ手元スコアと本番スコアが大きくズレたのか？</h3>
<p>分析を進めたところ、全20万行ある <code>train.csv</code> の中に、全く同じ特徴量（286列の数値）を持つ<b>「重複行」が約1.1万行（全体の約5%以上）</b>も存在していることが判明しました。</p>
<ul>
<li><b>丸暗記による過学習：</b> 通常の <code>StratifiedKFold</code> で分割すると、全く同じデータが「学習用」と「検証用」の両方に分散して入り込んでしまいます。結果としてモデルがデータを暗記してしまい、手元のCVだけが異常に高く（0.99553）評価されていました。</li>
<li><b>本番データでの失速：</b> Kaggleのテストデータには未知のデータが含まれるため、暗記に頼ったモデルは本番環境（LB 0.93937）で威力を発揮できませんでした。</li>
</ul>
<h3 style="color: blue;">2. 対策：重複行の一元化と sample_weight の導入</h3>
<p>単に重複行を削除（<code>drop_duplicates</code>）するだけでは、「そのデータがどれだけ高頻度で出現するか」という重要な確率情報（重み）が失われてしまいます。</p>
<p>そこで、<code>groupby().size()</code> を活用して重複行を1行に集約しつつ、出現回数を <code>sample_weight</code>（サンプルの重み）として LightGBM に与えて学習させるアプローチ（<code>sample2.py</code>）へコードを全修正しました。</p>
<pre style="background-color: #2d3748; color: #fff; padding: 15px; border-radius: 5px; font-family: monospace; font-size: 0.9em; overflow-x: auto; line-height: 1.5; white-space: pre;">import pandas as pd
import numpy as np
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
import lightgbm as lgb
import warnings

warnings.filterwarnings("ignore")

# 1. データの読み込みと重複処理
print("Loading data...")
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')

X_raw = train.drop(columns=['row_id'])
X_test = test.drop(columns=['row_id'])

# 特徴量とターゲットが全く同じ行を集計して重み（sample_weight）を作成
features = [col for col in X_raw.columns if col != 'target']
train_dedup = X_raw.groupby(features + ['target']).size().reset_index(name='sample_weight')

X = train_dedup[features]
y_raw = train_dedup['target']
sample_weight = train_dedup['sample_weight']

print(f"元のデータ数: {len(train)} 行")
print(f"重複除去後のデータ数: {len(X)} 行")  # 123,993 行へ圧縮

# ターゲットの数値変換
le = LabelEncoder()
y = le.fit_transform(y_raw)

# 2. 多クラス分類パラメータ
params = {
    'objective': 'multiclass',
    'num_class': 10,
    'metric': 'multi_logloss',
    'verbosity': -1,
    'boosting_type': 'gbdt',
    'learning_rate': 0.1,
    'random_state': 42
}

# 3. Stratified K-Fold（sample_weight付き）
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
oof_preds = np.zeros((len(X), 10))
test_preds = np.zeros((len(test), 10))

for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)):
    X_train, y_train, w_train = X.iloc[train_idx], y[train_idx], sample_weight.iloc[train_idx]
    X_val, y_val, w_val = X.iloc[val_idx], y[val_idx], sample_weight.iloc[val_idx]
    
    model = lgb.LGBMClassifier(**params, n_estimators=1000)
    
    # fit時に sample_weight を適用
    model.fit(
        X_train, y_train,
        sample_weight=w_train,
        eval_set=[(X_val, y_val)],
        eval_sample_weight=[w_val],
        callbacks=[lgb.early_stopping(stopping_rounds=50, verbose=False)]
    )
    
    oof_preds[val_idx] = model.predict_proba(X_val)
    test_preds += model.predict_proba(X_test) / skf.n_splits

# 4. 正しい重み付き評価（Accuracy）の算出
oof_classes = np.argmax(oof_preds, axis=1)
cv_accuracy = accuracy_score(y, oof_classes, sample_weight=sample_weight)
print(f"修正後の手元交差検証スコア（Accuracy）: {cv_accuracy:.5f}")

# 5. 提出用ファイルの作成
test_classes_num = np.argmax(test_preds, axis=1)
test_classes_str = le.inverse_transform(test_classes_num)

submission = pd.DataFrame({
    'row_id': test['row_id'],
    'target': test_classes_str
})
submission.to_csv('submission_tps_feb2022_dedup_lgb.csv', index=False)
</pre>
<h3 style="color: blue;">3. 実行結果とスコア比較</h3>
<p>重複一元化を行ったモデルの実行ログおよびKaggleへ再提出（Late Submit）した結果の推移です。</p>
<pre style="background-color: #2d3748; color: #fff; padding: 15px; border-radius: 5px; font-family: monospace; font-size: 0.95em; overflow-x: auto; line-height: 1.4;">Loading data...
Processing duplicates...
元のデータ数: 200000 行
重複除去後のデータ数: 123993 行

Starting Cross Validation with sample_weight...
 Fold 1 finished.
 Fold 2 finished.
 Fold 3 finished.
 Fold 4 finished.
 Fold 5 finished.

========================================
修正後の手元交差検証スコア（Accuracy）: 0.95766
========================================
</pre>
<p><b>【実験結果の比較表】</b></p>
<table border="1" style="border-collapse: collapse; width: 100%; text-align: center; margin: 15px 0;">
<tbody>
<tr style="background-color: #f2f2f2;"><th>手法</th><th>手元CV (Accuracy)</th><th>Kaggle Public LB</th><th>評価</th></tr>
<tr>
<td>1. 生データ (無加工)</td>
<td>0.99553</td>
<td>0.94192 (0.93937)</td>
<td>重複データによるリークでCVが歪んでいた</td>
</tr>
<tr>
<td style="font-weight: bold; color: #d9534f;">2. 重複除去 + sample_weight</td>
<td style="font-weight: bold; color: #d9534f;">0.95766</td>
<td style="font-weight: bold; color: #d9534f;">0.94317 (Private: 0.94024)</td>
<td style="font-weight: bold; color: #d9534f;">CVが健全化し、本番スコアも着実に向上！</td>
</tr>
</tbody>
</table>
<h3 style="color: blue;">4. 考察とエンジニアとしての気づき</h3>
<p>手元のCVスコアは前回の「丸暗記による異常値（0.99553）」から<b>0.95766</b>へと下がり、現実的で信頼できる検証値へと正常化されました。そして何より、<b>Kaggle本番（Public LB）のスコアが 0.94192 &rarr; 0.94317 へとしっかり向上</b>したことが大きな成果です。</p>
<ul>
<li><b>検証環境（CV）の重要性：</b> 「CVスコアが高ければ良い」わけではなく、適切な前処理によって本番環境（テストデータ）の挙動を正しく反映する検証環境を作ることが最優先であると再認識しました。</li>
<li><b>重み付けの有効性：</b> 単純な <code>drop_duplicates</code> でデータ量を減らすだけでなく、出現回数を <code>sample_weight</code> としてモデルに伝えることで、情報量を維持したまま過学習を防止できました。</li>
</ul>
<p>手元検証の基盤が整ったため、いよいよ次回はこのコンペの「真のキーパーツ」であるドメイン知識（GCD：最大公約数を用いた実験スケールの復元）を取り入れ、本番スコアの上位帯（0.98以上）への到達を目指します。</p>
<hr />
<p style="font-style: italic; color: #666;">次回は、GCD（最大公約数）特徴量の計算・追加によるモデルの飛躍的な精度向上に挑戦します。<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/240</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/240/" />
    <published>2026-09-23T11:15:27+09:00</published> 
    <updated>2026-09-23T11:15:27+09:00</updated> 
    <category term="その他" label="その他" />
    <title>【TensorFlow】2つのスカラー（定数）で四則演算を行う基本コード</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>TensorFlowを扱い始めるとき、まず押さえておきたいのが最も基本的なデータ単位である「スカラー（単一の数値）」の作成と、それらを使った基本的な計算方法です。今回は、2つのスカラー定数を作成し、加算・減算・乗算・除算を行う最小のサンプルコードを整理します。</p>
<h3 style="color: blue;">1. 【 概要 】</h3>
<p>TensorFlowにおける数値やデータは、すべて「Tensor（テンソル）」というオブジェクトとして扱われます。</p>
<p>0次元のテンソル（単一の数値）を「スカラー」と呼び、<code>tf.constant()</code> 関数を使うことで簡単に定義できます。Python標準の数値と同じ感覚で、TensorFlowの関数を使って四則演算を実行できます。</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 基本手順（2つのステップ） 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.1em; line-height: 1.8; text-align: left;"><b>(1) tf.constant() によるスカラー定数の定義</b><br />
<code>a = tf.constant(10)</code> のように、任意の数値を指定してテンソル（スカラー）を作成する。<br />
<b>(2) TensorFlowの演算関数（または標準演算子）の実行</b><br />
<code>tf.add()</code> や <code>+</code> 演算子などを使用して、定義したスカラー同士の計算を行う。</div>
<hr />
<h3 style="color: blue;">3. 整理：スカラー演算の「基本コード」と出力の読み方</h3>
<p>実際のコードと、計算結果がどのように出力されるかのポイントを詳しく見ていきましょう。</p>
<p>【 演算方法と結果のポイント 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">・<b>基本演算子の使用（+, -, *, /）</b><br />
通常のPythonコードと同様に <code>a + b</code> や <code>a * b</code> と記述するだけで、TensorFlow内部で自動的に演算処理が行われます。<br />
<br />
・<b>専用関数の使用（tf.add, tf.multiply等）</b><br />
<code>tf.add(a, b)</code> や <code>tf.multiply(a, b)</code> といったTensorFlow独自の関数を使うことも可能です。可読性や処理明示のために使い分けられます。<br />
<br />
・<b>出力値（tf.Tensor）の読み方</b><br />
計算結果を出力すると <code>tf.Tensor(15, shape=(), dtype=int32)</code> のような形式で表示されます。<code>shape=()</code> は0次元（スカラー）であることを意味し、<code>.numpy()</code> を付けることで数値だけを取り出せます。</div>
<h3 style="color: blue;">4. 関連して押さえたい「スカラー演算の主な関数」</h3>
<p>TensorFlowで用意されている代表的な四則演算関数の一覧です。</p>
<p>・<b>加算（足し算）</b>：<code>tf.add(a, b)</code> （演算子: <code>a + b</code>）<br />
・<b>減算（引き算）</b>：<code>tf.subtract(a, b)</code> （演算子: <code>a - b</code>）<br />
・<b>乗算（掛け算）</b>：<code>tf.multiply(a, b)</code> （演算子: <code>a * b</code>）<br />
・<b>除算（割り算）</b>：<code>tf.divide(a, b)</code> （演算子: <code>a / b</code>）</p>
<hr />
<h3 style="color: orange;">5. 補足：Pythonでの実装コード例</h3>
<p>Google Colab等でそのまま実行できるスカラー演算のサンプルコードと実際の実行結果です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f5f5f5; color: #222222;"><span style="color: #666666;"># コード実行例</span><br />
import tensorflow as tf<br />
<br />
<span style="color: #666666;"># 1. 2つのスカラー定数を定義</span><br />
a = tf.constant(10)<br />
b = tf.constant(5)<br />
<br />
<span style="color: #666666;"># 2. 四則演算の実行</span><br />
add_result = tf.add(a, b) <span style="color: #666666;"># 加算 (10 + 5)</span><br />
sub_result = tf.subtract(a, b) <span style="color: #666666;"># 減算 (10 - 5)</span><br />
mul_result = tf.multiply(a, b) <span style="color: #666666;"># 乗算 (10 * 5)</span><br />
div_result = tf.divide(a, b) <span style="color: #666666;"># 除算 (10 / 5)</span><br />
<br />
<span style="color: #666666;"># 3. 結果の表示</span><br />
print("加算（Tensorオブジェクト）:", add_result)<br />
print("加算（数値のみ抽出）:", add_result.numpy())<br />
print("減算:", sub_result.numpy())<br />
print("乗算:", mul_result.numpy())<br />
print("除算:", div_result.numpy())<br />
<br />
<span style="color: #666666;"># 出力結果</span><br />
<span style="color: #666666;"># 加算（Tensorオブジェクト）: tf.Tensor(15, shape=(), dtype=int32)</span><br />
<span style="color: #666666;"># 加算（数値のみ抽出）: 15</span><br />
<span style="color: #666666;"># 減算: 5</span><br />
<span style="color: #666666;"># 乗算: 50</span><br />
<span style="color: #666666;"># 除算: 2.0</span></div>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>TensorFlowにおける数値操作の最小単位である「スカラー」は、<code>tf.constant()</code> で生成し、直感的な演算子や専用関数で簡単に計算できます。<code>.numpy()</code> メソッドを使えば通常のPython数値として結果を取り出せる点もポイントです。まずはこの基本演算からTensorFlowの記法に慣れていきましょう！<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/239</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/239/" />
    <published>2026-09-23T11:07:31+09:00</published> 
    <updated>2026-09-23T11:07:31+09:00</updated> 
    <category term="その他" label="その他" />
    <title>【TensorFlow】Google Colabで始める環境構築手順と動作確認</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>「TensorFlowでAIや機械学習を始めてみたいけれど、PCの環境構築が難しそう&hellip;」と悩んでいませんか？今回は、ブラウザとGoogleアカウントさえあればインストール不要・無料でTensorFlowを動かせる「Google Colaboratory（通称 Colab）」を使った環境構築と動作確認手順を整理します。</p>
<h3 style="color: blue;">1. 【 概要 】</h3>
<p>Google Colaboratory（Google Colab）とは、Googleが提供するブラウザ上でPythonのコードを実行できる開発環境です。</p>
<p>面倒なライブラリのインストールや環境構築が一切不要で、あらかじめTensorFlowやNumPyといった主要なAIライブラリが組み込まれています。さらに、AIの計算を高速化する「GPU」環境も無料で利用できるため、初心者の学習に最適です。</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 基本手順（2つのステップ） 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.1em; line-height: 1.8; text-align: left;"><b>(1) ノートブックの作成とGPU設定</b><br />
Google Colabにアクセスして新しいノートブックを作成し、高速処理用の「GPU環境」を有効化する。<br />
<b>(2) テストコードによる動作確認</b><br />
TensorFlowのバージョン確認およびGPUの認識確認を行うコードを実行する。</div>
<hr />
<h3 style="color: blue;">3. 整理：環境構築の「ステップ順」徹底解説</h3>
<p>Google Colab上でTensorFlowを動かすための具体的な手順を詳しく見ていきましょう。</p>
<p>【 各ステップの具体的な操作 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">・<b>ステップ1：Colabにアクセスしノートブックを作成する</b><br />
ブラウザで Google Colab にアクセスし、Googleアカウントでログインします。画面右下の「ノートブックを新規作成」をクリックして新しい作業画面を開きます。<br />
<br />
・<b>ステップ2：ハードウェアアクセラレータ（GPU）を設定する</b><br />
上部メニューの「ランタイム」＞「ランタイムのタイプを変更」を開き、ハードウェアアクセラレータで「T4 GPU」（または「GPU」）を選択して保存します。（※簡単な文法確認のみであればCPUのままでも構いません）<br />
<br />
・<b>ステップ3：動作確認コードを実行する</b><br />
コードセルに動作確認用のPythonコードを入力し、再生ボタン（▶）または Shift + Enter キーを押して実行します。</div>
<h3 style="color: blue;">4. 関連して押さえたい「実行時の注意点と仕様」</h3>
<p>Google Colabでコードを実行した際、「すぐに実行されずに待たされる」ことがあります。これらはColabの仕様によるものです。</p>
<p>・<b>初回接続（初期化）の待ち時間</b>：ノートブックを開いて一番最初にコードを実行する際は、裏側で仮想サーバーを起動する処理（割り当て・初期化）が行われるため、数秒〜数十秒の待ち時間が発生します。<br />
・<b>GPUのキュー待ち（順番待ち）</b>：無料版のGPUサーバーはユーザー間で共有されているため、混雑する時間帯は「割り当て待ち」のキューに入ることがあります。<br />
・<b>セッションの保持</b>：一定時間操作を行わないと接続が切断され、実行中のメモリ内容が初期化されます。（作成したコード自体はGoogleドライブに自動保存されます）</p>
<hr />
<h3 style="color: orange;">5. 補足：動作確認用Pythonコード例</h3>
<p>以下のコードをColabに貼り付けて実行することで、TensorFlowが正常に動作しているか、またGPUが認識されているかを確認できます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f5f5f5; color: #222222;"><span style="color: #666666;"># コード実行例</span><br />
import tensorflow as tf<br />
<br />
<span style="color: #666666;"># 1. TensorFlowのバージョン確認</span><br />
print("TensorFlow バージョン:", tf.__version__)<br />
<br />
<span style="color: #666666;"># 2. GPUの認識確認</span><br />
gpu_devices = tf.config.list_physical_devices('GPU')<br />
if gpu_devices:<br />
&nbsp;&nbsp;&nbsp;&nbsp;print("使用可能なGPU:", gpu_devices[0].name)<br />
else:<br />
&nbsp;&nbsp;&nbsp;&nbsp;print("GPUは認識されていません（CPUモードで動作中）")<br />
<br />
<span style="color: #666666;"># 出力イメージ</span><br />
<span style="color: #666666;"># TensorFlow バージョン: 2.20.0</span><br />
<span style="color: #666666;"># 使用可能なGPU: /physical_device:GPU:0</span></div>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>Google Colabを使えば、難解なローカル環境の構築を行うことなく、**「ブラウザを開いてすぐにTensorFlowを動かす」** ことが可能です。出力結果にバージョン番号と「/physical_device:GPU:0」が表示されれば、環境構築は無事成功です。まずは手軽なColab環境からディープラーニングの学習をスタートしてみましょう！<br />
<br />
<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/238</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/238/" />
    <published>2026-09-23T07:38:28+09:00</published> 
    <updated>2026-09-23T07:38:28+09:00</updated> 
    <category term="DS検定＞1-3-1. 学習モデル" label="DS検定＞1-3-1. 学習モデル" />
    <title>【DS検定対策】深層学習の最大の壁！「勾配消失問題」の原因と対策</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>ディープラーニング（深層学習）において、ネットワークの層を深くすればするほど学習が難しくなる大きな原因の一つが<b>「勾配消失問題（Vanishing Gradient Problem）」</b>です。そのメカニズムと克服のための対策を整理しましょう！</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>ニューラルネットワークの層を深くした際、誤差逆伝播法において出力層から入力層に向かって遡るにつれて勾配（微分値）が小さくなりゼロに近づくことで、入力層に近い重みが更新されず学習が進まなくなる現象を何と呼ぶでしょうか？</p>
<p>① 勾配消失問題（Vanishing Gradient Problem）<br />
② 勾配爆発問題（Exploding Gradient Problem）<br />
③ 欠損値問題（Missing Value Problem）<br />
④ 多重共線性（Multicollinearity）</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① 勾配消失問題（Vanishing Gradient Problem）</div>
<hr />
<h3 style="color: blue;">3. 整理：なぜ勾配が消失してしまうのか？</h3>
<p>主な原因は、従来使われていた活性化関数<b>「シグモイド関数」</b>の微分特性と、連鎖律（チェーンルール）にあります。</p>
<table border="1" style="border-collapse: collapse; width: 100%; text-align: left; cellpadding: 8px;">
<tbody>
<tr style="background-color: #f2f2f2; text-align: center;"><th style="width: 30%;">要素</th><th style="width: 70%;">仕組みと影響</th></tr>
<tr>
<td><b>シグモイド関数の微分値</b></td>
<td>シグモイド関数の微分係数は<b>最大でも 0.25（1未満）</b>です。</td>
</tr>
<tr>
<td><b>連鎖律による掛け算</b></td>
<td>誤差逆伝播では、層を1つ遡るごとに微分値を掛け合わせます。<br />
「1未満の数（0.25以下）」を何十層も掛け合わせると、<b>数値は急速にゼロに近づきます（消失）</b>。</td>
</tr>
<tr>
<td><b>結果（学習の停止）</b></td>
<td>入力層に近いパラメータの勾配がほぼ 0 になるため、重みが更新されなくなります。</td>
</tr>
</tbody>
</table>
<hr />
<h3 style="color: blue;">4. 勾配消失を解決した「3つの画期的アプローチ」</h3>
<p>AIの歴史の中で、勾配消失問題を克服するために様々な技術が開発されました。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 12px; line-height: 1.6; background-color: #fafafa;"><b>① 活性化関数の見直し（ReLU関数の採用）：</b><br />
・入力が正のとき微分値が常に「1」となる <b>ReLU（Rectified Linear Unit）</b> を使うことで、何層遡っても勾配が小さくなりません。<br />
<br />
<b>② 適切な重みの初期化方法：</b><br />
・Xavier（ザビエル）の初期値（シグモイド向け）や <b>He（ハー）の初期値（ReLU向け）</b> を使い、データの広がりを適正化します。<br />
<br />
<b>③ ネットワーク構造の工夫（残差構造等）：</b><br />
・CNNでは <b>ResNet（Skip Connection）</b>、RNNでは <b>LSTM / GRU</b> を導入し、勾配をダイレクトに過去（手前の層）へ流すバイパス構造を作りました。</div>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>問：ニューラルネットワークの学習における「勾配消失問題」とその対策に関する記述として、最も適切なものはどれか。</b></p>
<p>① 勾配消失問題は、活性化関数にReLUを採用することで、正の入力領域における微分値が0になるため発生しやすくなる。<br />
② 重みの初期値を極めて大きな値に設定することで、誤差逆伝播時の勾配消失を完全に防止することができる。<br />
③ シグモイド関数を深層ニューラルネットワークの各層に使用すると、微分値の最大値が1未満であるため勾配消失が発生しやすい。<br />
④ 勾配消失問題が起きると、出力層に近い層ほどパラメータの更新量が小さくなり、入力層に近い層ほど急速に学習が進む。</p>
<p><b>【 正解： ③ 】</b></p>
<p><b>解説：</b> 勾配消失の原因と対策の正誤を問う重要問題です。<br />
③が正解です。シグモイド関数の微分値は最大0.25のため、層を重ねると勾配が消失します。<br />
①ReLUは正の領域で微分値が「1」となるため、勾配消失を防ぐ効果があります。<br />
②重みの初期値を大きくしすぎると、逆に「勾配爆発（Exploding Gradient）」を起こします。<br />
④勾配逆伝播は出力層から入力層へ遡るため、影響を受ける（更新が止まる）のは「入力層に近い層」です。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定や資格試験で「誤差逆伝播で勾配がゼロになる」「シグモイド関数の多層利用」「入力層側の重みが更新されない」が出たら、正解は「勾配消失問題」です！ 対策としての「ReLU関数」「Heの初期値」「ResNet（Skip Connection）」もセットで完璧に覚えておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/237</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/237/" />
    <published>2026-09-23T07:22:24+09:00</published> 
    <updated>2026-09-23T07:22:24+09:00</updated> 
    <category term="DS検定＞1-3-1. 学習モデル" label="DS検定＞1-3-1. 学習モデル" />
    <title>【DS検定対策】大量の文書からテーマを発見！「トピックモデル（LDA）」の仕組み</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>大量のニュース記事やレビュー文を分類したい時、1つずつ手作業で分類するのは不可能です。文章の集合から潜在的なテーマ（トピック）を自動で抽出・分類する手法が<b>「トピックモデル（Topic Model）」</b>です。その仕組みと代表例を整理しましょう！</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>自然言語処理やテキストマイニングにおいて、文章集合（コーパス）の中から潜在的なテーマや概念（トピック）を統計的に発見し、各文書がどのトピックにどれくらいの割合で関連しているかを分類・抽出する手法を何と呼ぶでしょうか？</p>
<p>① トピックモデル（Topic Model）<br />
② 単語埋め込みモデル（Word Embedding）<br />
③ 分散表現モデル（Distributed Representation）<br />
④ 形態素解析（Morphological Analysis）</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① トピックモデル（Topic Model）</div>
<hr />
<h3 style="color: blue;">3. 整理：トピックモデルの基本的な考え方</h3>
<p>トピックモデルでは、<b>「1つの文書は複数のトピックが一定の割合で混ざり合ってできている」</b>と仮定します。</p>
<table border="1" style="border-collapse: collapse; width: 100%; text-align: left; cellpadding: 8px;">
<tbody>
<tr style="background-color: #f2f2f2; text-align: center;"><th style="width: 30%;">構成要素</th><th style="width: 70%;">内容・イメージ</th></tr>
<tr>
<td><b>トピック（潜在的テーマ）</b></td>
<td>関連する単語の確率分布（例：「スポーツ」トピック ＝ 球団・選手・試合・勝利 などの単語が出やすい）。</td>
</tr>
<tr>
<td><b>文書の分解・分類</b></td>
<td>ある記事を「スポーツ 70% ＋ 経済 30%」のように<b>確率的な比率（割合）</b>で表現・分類する。</td>
</tr>
</tbody>
</table>
<hr />
<h3 style="color: blue;">4. 超重要！代表的手法「LDA（潜在ディリクレ配分法）」</h3>
<p>DS検定や資格試験で「トピックモデル」とセットで必ず問われるのが<b>「LDA（Latent Dirichlet Allocation）」</b>です。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 12px; line-height: 1.6; background-color: #fafafa;">・<b>LDA（Latent Dirichlet Allocation）：</b><br />
トピックモデルの中で最も代表的な<b>「教師なし学習」</b>の確率モデル。<br />
事前分類（ラベル）のない大量のテキストから、文書ごとのトピック割合と、トピックごとの単語出現分布を同時に自動推定します。<br />
<br />
・<b>主な用途：</b><br />
ニュース記事の自動タグ付け、顧客レビューの不満テーマ抽出、類似文書の推薦システムなど。</div>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>問：テキストデータの分析手法に関する記述として、最も適切なものはどれか。</b></p>
<p>① LDA（Latent Dirichlet Allocation）は、各文書があらかじめ指定された単一のカテゴリに属することを前提とした教師あり分類アルゴリズムである。<br />
② トピックモデルは、文書集合の中に潜む潜在的なテーマ（トピック）と単語の確率分布を統計的に推定する「教師なし学習」の手法である。<br />
③ トピックモデルを実行する前に、文章中の文字n-gramや形態素解析を行うことは原理的に不可能である。<br />
④ TF-IDFは、文書ごとの潜在的なトピック割合を確率分布として直接出力する代表的なトピックモデルである。</p>
<p><b>【 正解： ② 】</b></p>
<p><b>解説：</b> トピックモデルの定義と特徴を問う標準問題です。<br />
②が正解です。教師ラベルなしで文章から潜在的なトピック（テーマ）を発見します。<br />
①LDAは単一カテゴリ固定ではなく、複数のトピック比率を持つ「教師なし学習」モデルです。<br />
③形態素解析等で単語に分かち書きしたデータを入力として使うのが一般的です。<br />
④TF-IDFは単語の重要度（出現頻度とレア度）を算出する手法であり、トピックモデル（確率分布の推定）とは異なります。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定や資格試験で「文章から潜在的なトピック（テーマ）を発見」「教師なし学習」「LDA（潜在ディリクレ配分法）」といったキーワードが出たら、正解は「トピックモデル」です！ 「文書は複数のトピックの混ぜ合わせ（確率分布）で表現できる」という考え方をしっかり押さえておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/236</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/236/" />
    <published>2026-09-23T07:19:21+09:00</published> 
    <updated>2026-09-23T07:19:21+09:00</updated> 
    <category term="その他" label="その他" />
    <title>【データマイニング】Aprioriアルゴリズムによる相関分析（アソシエーション分析）の仕組み</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>データマイニングにおいて「商品Aを買う人は、商品Bも一緒に買いやすい」といった購買データの隠れたパターンを発見する手法を相関分析（アソシエーション分析）と呼びます。その代表的な手法である「Apriori（アプリオリ）アルゴリズム」の仕組みと、根幹となる重要指標を整理します。</p>
<h3 style="color: blue;">1. 【 概要 】</h3>
<p>Aprioriアルゴリズムとは、膨大な取引データの中から「頻繁に同時に購入される商品の組み合わせ（関連ルール）」を効率よく検出するためのアルゴリズムです。</p>
<p>有名な「おむつを買う人はビールも一緒に買う」のような購買傾向を発見し、商品の陳列改善やECサイトのレコメンド機能に活用されています。</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 基本手順（2つのステップ） 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.1em; line-height: 1.8; text-align: left;"><b>(1) 支持度（Support）による候補絞り込み（枝刈り）</b><br />
設定した閾値（しきい値）以上の支持度を持つ「頻繁に買われる組み合わせ」だけを抽出する。<br />
<b>(2) 確信度（Confidence）によるフィルタリング</b><br />
抽出された組み合わせの中で、設定した確信度の閾値を下回るルールを取り除く。</div>
<hr />
<h3 style="color: blue;">3. 整理：最重要指標「支持度」と「確信度」の徹底解説</h3>
<p>Aprioriアルゴリズムの選別基準となる「支持度」と「確信度」、そしてルールの有効性を測る「リフト値」の意味を詳しく見ていきましょう。</p>
<p>【 評価指標の具体的な意味 】</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6;">・<b>指標(1)：支持度（Support）＝ 全体における「出現率」</b><br />
全レジ通過数（全取引）の中で「商品Aと商品Bが同時に買われた割合」です。<br />
「そもそもめったに買われない組み合わせ」を無駄に計算しないよう、ステップ1の候補作成段階で切り捨てる（枝刈りする）ために使います。<br />
例：全100件の買い物中、おむつとビールが同時に買われたのが15件なら、支持度は「15%（0.15）」。<br />
<br />
・<b>指標(2)：確信度（Confidence）＝ Aを買った人の「併買い率」</b><br />
商品Aを買った人のうち「どれくらいの割合で商品Bも一緒に買ったか」という確率です。<br />
「Aを買うならBも買うはず」という予測の信頼度を表し、ステップ2のフィルタリングで基準未満のルールを取り除きます。<br />
例：おむつを買った人20人のうち、ビールも買った人が15人なら、確信度は「75%（0.75）」。<br />
<br />
・<b>指標(3)：リフト値（Lift）＝ 偶然ではない「関連性の強さ」</b><br />
「商品Bの本来の売れ行き」に対して「商品Aと一緒に買うことでどれくらい買いやすくなったか」を示す倍率です。<br />
「1.0」を超えると強い関連性があり、1.0以下なら「ただどちらも単体で人気なだけ（偶然）」と判断できます。</div>
<h3 style="color: blue;">4. 関連して押さえたい「アルゴリズムの具体的な流れ」</h3>
<p>「支持度」と「確信度」を使って、内部でどのようにデータが処理されていくか、ステップ順に整理します。</p>
<p>・<b>ステップ1（候補の生成）</b>：全データから「支持度」が閾値以上の組み合わせ（よく買われるペア）だけを抽出する。「めったに買われない商品は何と組みあわせても買われない」という原則（アプリオリ原理）を使い、ここで計算量を一気に減らします。<br />
・<b>ステップ2（フィルタリング）</b>：抽出されたペアの中から、「確信度」が閾値未満のルールを排除する。「Aを買う人はBも買う」という推論の精度が高いものだけが残ります。<br />
・<b>ステップ3（評価）</b>：残ったルールに対して「リフト値」を確認し、実務で使える真の関連ルールを決定します。</p>
<hr />
<h3 style="color: orange;">5. 補足：Python（mlxtend）での実装コード例</h3>
<p>Pythonの `mlxtend` ライブラリを使用すると、支持度と確信度の閾値を指定するだけで簡単に関連ルールを抽出できます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 10px; line-height: 1.6; background-color: #f5f5f5; color: #222222;"><span style="color: #666666;"># コード実行例</span><br />
from mlxtend.frequent_patterns import apriori, association_rules<br />
<br />
<span style="color: #666666;"># 1. 最小支持度（min_support=0.1＝全体の10%以上で出現）で候補を絞り込み</span><br />
frequent_itemsets = apriori(df, min_support=0.10, use_colnames=True)<br />
<br />
<span style="color: #666666;"># 2. 最小確信度（min_threshold=0.6＝併買い率60%以上）でフィルタリング</span><br />
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.6)<br />
<br />
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])<br />
<br />
<span style="color: #666666;"># 出力イメージ</span><br />
<span style="color: #666666;"># antecedents: [おむつ] -&gt; consequents: [ビール] | support: 0.15 | confidence: 0.75 | lift: 2.1</span></div>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>Aprioriアルゴリズムは、**「支持度」で全体の出現頻度を見て無駄な計算をカット（候補作成）**し、**「確信度」でルールの信頼性をチェックして不十分なものを除外（フィルタリング）**する合理的かつスマートな仕組みです。この2つの指標の意味を押さえておくことで、データ分析の結果を正しくビジネスの現場に還元できるようになります！<br />
<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/235</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/235/" />
    <published>2026-09-22T22:03:24+09:00</published> 
    <updated>2026-09-22T22:03:24+09:00</updated> 
    <category term="DS検定＞1-3-1. 学習モデル" label="DS検定＞1-3-1. 学習モデル" />
    <title>【DS検定対策】指示に従うAIを作る！「インストラクションチューニング」の仕組み</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>事前学習（Pre-training）を終えたばかりのLLM（大規模言語モデル）は、単に「文章の続きを予測・補完する」ことしかできません。これに対し、<b>「人間の指示に的確に従って回答する能力」</b>を与えるための重要な学習プロセスが<b>「インストラクションチューニング（Instruction Tuning）」</b>です！</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>LLM（大規模言語モデル）の学習プロセスにおいて、人間が準備した「指示（Instruction）」と「理想的な応答（Output）」のペアデータを学習させ、ユーザーの意図や命令に従って適切に応答できるように微調整する手法を何と呼ぶでしょうか？</p>
<p>① インストラクションチューニング（Instruction Tuning）<br />
② 事前学習（Pre-training）<br />
③ 事後学習（Post-training）なしのゼロショット学習<br />
④ 継続的事前学習（Continued Pre-training）</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① インストラクションチューニング（Instruction Tuning）</div>
<hr />
<h3 style="color: blue;">3. 整理：ベースモデルと指示応答モデルの違い</h3>
<p>事前学習のみを行ったモデル（ベースモデル）と、インストラクションチューニングを施したモデルでは、同じ入力に対する挙動が全く異なります。</p>
<table border="1" style="border-collapse: collapse; width: 100%; text-align: left; cellpadding: 8px;">
<tbody>
<tr style="background-color: #f2f2f2; text-align: center;"><th style="width: 25%;">モデルの段階</th><th style="width: 35%;">学習データの形式</th><th style="width: 40%;">「日本の首都は？」と入力した時の反応</th></tr>
<tr>
<td><b>ベースモデル<br />
（事前学習のみ）</b></td>
<td>Web上の大量の生テキスト<br />
（単語の穴埋め・続き予測）</td>
<td>「日本の首都は？ <b>アメリカの首都は？ フランスの首都は？&hellip;</b>」と、問題文の続き（クイズの列挙など）を予測・出力してしまう。</td>
</tr>
<tr>
<td><b>指示応答モデル<br />
（Instruction Tuning後）</b></td>
<td><b>「指示」と「回答」のペア</b><br />
（教師ありデータセット）</td>
<td>「日本の首都は<b>東京です。</b>」と、指示を理解して正確な回答を返す。</td>
</tr>
</tbody>
</table>
<hr />
<h3 style="color: blue;">4. LLM開発の3ステップ（全体像の中での位置づけ）</h3>
<p>生成AI（LLM）が完成するまでには、一般的に以下の3つの大きなステップを踏みます。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 12px; line-height: 1.6; background-color: #fafafa;"><b>Step 1：事前学習（Pre-training）</b><br />
・ネット上の数兆トークンの文章を読み込み、言語の文法や世の中の知識を学ぶ（基礎体力をつける）。<br />
<br />
<b>Step 2：インストラクションチューニング（SFT） ★今回のお題！</b><br />
・「指示と回答のペア」を数万〜数十万件学習させ、「命令に従って応答するスタイル」を身につける。<br />
<br />
<b>Step 3：RLHF / DPO（人間のフィードバックによる学習）</b><br />
・人間の好みや安全性（有害な出力をしない等）に合わせて回答の質や振る舞いを最終微調整する。</div>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>问：大規模言語モデル（LLM）における「インストラクションチューニング（Instruction Tuning）」に関する記述として、最も適切なものはどれか。</b></p>
<p>① インターネット上のラベルのない大量のテキストデータを使い、次の単語を予測する自己教師あり学習の手法である。<br />
② 「指示文」と「それに対する適切な応答文」のペアデータを用いてモデルを微調整し、様々なタスクや命令に意図通り従う能力を向上させる手法である。<br />
③ モデルの出力結果に対して人間が評価（報酬）を与え、強化学習を用いてモデルの安全性を向上させる手法である。<br />
④ 外部のデータベースから関連文書を検索・取得し、それをプロンプトに含めて回答を生成させる手法である。</p>
<p><b>【 正解： ② 】</b></p>
<p><b>解説：</b> インストラクションチューニングの定義を問う標準問題です。<br />
②が正解です。指示と回答のペアデータを用いた教師ありファインチューニング（SFT）です。<br />
①は「事前学習（Pre-training）」の説明です。<br />
③は「RLHF（Reinforcement Learning from Human Feedback）」の説明です。<br />
④は「RAG（検索拡張生成）」の説明です。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定や資格試験で「指示と応答のペア」「SFT（教師あり微調整）」「指示に従う能力の獲得」「ベースモデルからの対話モデル化」といったキーワードが出たら、正解は「インストラクションチューニング」です！ 単なる文章補完（事前学習）から対話型AI（ChatGPT等）へ橋渡しをする超重要技術として、全体の学習ステップと一緒に押さえておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/234</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/234/" />
    <published>2026-09-22T22:00:53+09:00</published> 
    <updated>2026-09-22T22:00:53+09:00</updated> 
    <category term="DS検定＞1-3-1. 学習モデル" label="DS検定＞1-3-1. 学習モデル" />
    <title>【DS検定対策】自然言語処理の基本！テキストをn個ずつ区切る「n-gram」の仕組み</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>テキストデータをAIやプログラムで処理する際、文章をそのまま扱うことはできません。文章を<b>「連続する n 個の文字や単語の単位」</b>に細かく区切って分析する手法が<b>「n-gram（エヌグラム）」</b>です。その仕組みと種類を整理しましょう！</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>自然言語処理（NLP）において、与えられた文字列や文章に対して、隣り合う連続した n 個の文字（または単語）のまとまりに分割して抽出する手法を何と呼ぶでしょうか？</p>
<p>① n-gram（エヌグラム）<br />
② TF-IDF（ティーエフ・アイディーエフ）<br />
③ Word2Vec（ワード・ツー・ベック）<br />
④ 形態素解析（Morphological Analysis）</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① n-gram（エヌグラム）</div>
<hr />
<h3 style="color: blue;">3. 整理：nの値による呼び方と具体的例</h3>
<p>「データ分析」というテキストを<b>文字単位（文字n-gram）</b>で分割する場合の具体例を見てみましょう。</p>
<table border="1" style="border-collapse: collapse; width: 100%; text-align: left; cellpadding: 8px;">
<tbody>
<tr style="background-color: #f2f2f2; text-align: center;"><th style="width: 25%;">呼び方</th><th style="width: 15%;">nの値</th><th style="width: 60%;">「データ分析」を文字単位で区切った結果</th></tr>
<tr>
<td><b>Unigram<br />
（ユニグラム）</b></td>
<td>n = 1</td>
<td>「デ」「ー」「タ」「分」「析」<br />
（1文字ずつバラバラに分割）</td>
</tr>
<tr>
<td><b>Bigram<br />
（バイグラム）</b></td>
<td>n = 2</td>
<td>「デー」「ータ」「タ分」「分析」<br />
（連続する2文字ずつスライドして抽出）</td>
</tr>
<tr>
<td><b>Trigram<br />
（トライグラム）</b></td>
<td>n = 3</td>
<td>「データ」「ータ分」「タ分析」<br />
（連続する3文字ずつスライドして抽出）</td>
</tr>
</tbody>
</table>
<hr />
<h3 style="color: blue;">4. 単語n-gramと文字n-gramの違い</h3>
<p>n-gramには「文字単位」だけでなく「単語単位」で区切るパターンもあります。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 12px; line-height: 1.6; background-color: #fafafa;">【例】「AI の 活用」という文章の場合<br />
<br />
・<b>文字Bigram（n=2）：</b><br />
「AI」「I 」「 の」「の 」「 活」「活用」 （スペースも含めて2文字ずつ区切る）<br />
<br />
・<b>単語Bigram（n=2）：</b><br />
「AI の」「の 活用」 （形態素解析などで分かち書きされた2単語ずつ区切る）</div>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>問：テキストデータの前処理や特徴量抽出に関する記述として、最も適切なものはどれか。</b></p>
<p>① n-gramとは、文章中の単語の出現頻度と逆文書頻度を掛け合わせて、単語の重要度を数値化する手法である。<br />
② 文字列を連続するn個の要素（文字または単語）のリストに分割して抽出する手法をn-gramと呼び、n=2の場合をBigramと呼ぶ。<br />
③ n-gramを用いると、テキスト中の単語同士の文脈的・意味的な類似度を多次元ベクトル空間上の距離として自動的に表現できる。<br />
④ 形態素解析を行わずにn-gram（単語単位）を作成することは、日本語のような分かち書きをしない言語において常に容易である。</p>
<p><b>【 正解： ② 】</b></p>
<p><b>解説：</b> n-gramの基本性質を問う標準問題です。<br />
②が正解です。連続するn個の単位に区切る手法であり、2個ずつの場合はBigramと呼びます。<br />
①単語の出現頻度と逆文書頻度を掛け合わせる手法は「TF-IDF」の説明です。<br />
③単語の意味や類似度を多次元ベクトル空間で表現するのは「Word2Vec」などの分散表現（単語埋め込み）の説明です。<br />
④日本語のように単語間にスペースがない言語で「単語n-gram」を作るには、事前の形態素解析（分かち書き）が必要となります。一方、「文字n-gram」であれば辞書なしで容易に作成できるのがメリットです。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定や資格試験で「連続するn個の文字・単語」「1個＝Unigram」「2個＝Bigram」「3個＝Trigram」といったキーワードが出たら、正解は「n-gram」です！ 形態素解析（辞書が必要）を使わずにテキストの検索や分類を行える利点も含めて、しっかり理解しておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/233</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/233/" />
    <published>2026-09-22T21:58:03+09:00</published> 
    <updated>2026-09-22T21:58:03+09:00</updated> 
    <category term="DS検定＞1-3-1. 学習モデル" label="DS検定＞1-3-1. 学習モデル" />
    <title>【DS検定対策】確率や度合いで分類！「ソフトクラスタリング」と「ハードクラスタリング」の違い</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>教師なし学習の代表格である「クラスタリング」。データをグループ分けする際、1つのグループにスパッと分けるか、所属の「度合い（確率）」で柔軟に分けるかによって、大きく<b>「ハードクラスタリング」</b>と<b>「ソフトクラスタリング」</b>に分類されます。その仕組みと違いを整理しましょう！</p>
<h3 style="color: blue;">1. 【 問題 】</h3>
<p>クラスタリングの手法において、各データがいずれか1つのクラスタのみに属すると固定するのではなく、各クラスタへの「帰属の度合い（所属確率など）」を連続値として求める手法を何と呼ぶでしょうか？</p>
<p>① ソフトクラスタリング（Soft Clustering）<br />
② ハードクラスタリング（Hard Clustering）<br />
③ 階層的クラスタリング（Hierarchical Clustering）<br />
④ 次元削減（Dimensionality Reduction）</p>
<hr />
<h3 style="color: #d32f2f;">2. 【 解答 】</h3>
<div style="background-color: #eeeeee; border: 2px solid #333; padding: 15px; font-size: 1.2em; font-weight: bold; text-align: center;">正解： ① ソフトクラスタリング（Soft Clustering）</div>
<hr />
<h3 style="color: blue;">3. 整理：ハード vs ソフトクラスタリングの比較</h3>
<p>両者の最大の違いは「データとグループの関係性（曖昧さを許容するかどうか）」にあります。</p>
<table border="1" style="border-collapse: collapse; width: 100%; text-align: left; cellpadding: 8px;">
<tbody>
<tr style="background-color: #f2f2f2; text-align: center;"><th style="width: 25%;">分類タイプ</th><th style="width: 45%;">特徴・グループ分けの考え方</th><th style="width: 30%;">代表的な手法</th></tr>
<tr>
<td><b>ハードクラスタリング<br />
（Hard Clustering）</b></td>
<td>各データは<b>「必ずいずれか1つのクラスタ」</b>にのみ所属する（所属度は0か1の二者択一）。境界が明確。</td>
<td><b>k-means（k平均法）</b><br />
階層的クラスタリング</td>
</tr>
<tr>
<td><b>ソフトクラスタリング<br />
（Soft Clustering）</b></td>
<td>各データが<b>「複数のクラスタにどれくらいの度合い（確率）で属しているか」</b>を算出する。境界が曖昧なデータに強い。</td>
<td><b>ガウス混合モデル（GMM）</b><br />
ファジィc-means（FCM）</td>
</tr>
</tbody>
</table>
<hr />
<h3 style="color: blue;">4. 具体例でイメージ！ソフトクラスタリングの強み</h3>
<p>例えば、「顧客を『映画好き』と『音楽好き』のグループに分ける顧客セグメンテーション」を考えてみましょう。</p>
<div style="font-family: monospace; border: 1px solid #ccc; padding: 12px; line-height: 1.6; background-color: #fafafa;">・<b>ハードクラスタリング（k-means）：</b><br />
ある顧客を「映画好きグループ（100%）」と無理やり一方だけに判定します。<br />
<br />
・<b>ソフトクラスタリング（GMM等）：</b><br />
「映画好き度 70% ＋ 音楽好き度 30%」のように<b>度合いや確率</b>で表現します。<br />
<br />
どちらの趣味も併せ持つ「境界線上にいる曖昧なユーザー」を現実のデータに合わせて柔軟に表現できる点がソフトクラスタリング最大のメリットです。</div>
<hr />
<h3 style="color: orange;">5. DS検定形式：実戦4択クイズ</h3>
<p><b>問：クラスタリング手法に関する記述として、最も適切なものはどれか。</b></p>
<p>① k-means法は、データが各クラスタに所属する確率を算出する代表的なソフトクラスタリング手法である。<br />
② ソフトクラスタリングでは、1つのデータが複数のクラスタに対してそれぞれ異なる帰属度（所属確率など）を持つことができる。<br />
③ ハードクラスタリングは、データ間の確率分布を前提としたEMアルゴリズムを用いてクラスタリングを行う手法の総称である。<br />
④ ソフトクラスタリングを行う場合、最終的なクラスタの数は人間が事前に指定することが一切できない。</p>
<p><b>【 正解： ② 】</b></p>
<p><b>解説：</b> ソフトとハードの性質の違いを正しく理解しているか問う問題です。<br />
②が正解です。データごとに「A群に60%、B群に40%」のような帰属度を持たせることができます。<br />
①k-meansは代表的な「ハードクラスタリング」です。<br />
③EMアルゴリズムを用いて確率分布を推定するのはガウス混合モデル（GMM）などの「ソフトクラスタリング」です。<br />
④ソフトクラスタリング（GMMやFCM等）であっても、クラスタ数はハイパーパラメータとして指定するのが一般的です。</p>
<hr />
<h3 style="color: blue;">6. まとめ</h3>
<p>DS検定や資格試験で「帰属の度合い」「所属確率」「複数グループへの重複・曖昧な所属」といったフレーズが出たら、正解は「ソフトクラスタリング（代表例：GMM、ファジィc-means）」です！ 「0か1かで明確に分けるk-means＝ハード」、「確率や割合で柔軟に分けるGMM＝ソフト」というセットで完璧に覚えておきましょう！</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
  <entry>
    <id>learnms.blog.shinobi.jp://entry/232</id>
    <link rel="alternate" type="text/html" href="https://learnms.blog.shinobi.jp/Entry/232/" />
    <published>2026-09-13T18:44:37+09:00</published> 
    <updated>2026-09-13T18:44:37+09:00</updated> 
    <category term="【Kaggle挑戦記】" label="【Kaggle挑戦記】" />
    <title>【Kaggle挑戦記】TPS Feb 2022：DNA配列データで手元CV0.995超えからの「重複行の罠」</title>
    <content mode="escaped" type="text/html" xml:lang="utf-8"> 
      <![CDATA[<p>前回のMoAコンペ（マルチラベル分類）を一区切りとし、今回はDNA配列データを扱う過去コンペ<b>「Tabular Playground Series - Feb 2022（TPS Feb 2022）」</b>に参戦しました。まずは手動での特徴量生成（エンジニアリング）を一切行わず、素のデータをそのままLightGBMに投入して不動のベースラインスコアを算出します。</p>
<h3 style="color: blue;">1. コンペの概要とデータ構造</h3>
<p>このコンペティションは、ゲノムシーケンス解析の手法をモチーフにした<b>「10クラスの多クラス分類タスク」</b>です。</p>
<ul>
<li><b>データの中身：</b> ゲノム解読機で抽出された10文字のDNA断片（10-mer）の出現カウントデータです。<code>A0T0G0C10</code> から <code>A10T0G0C0</code> まで、全286パターンの比率（標準化された確率）がカラム（特徴量）として並んでいます。</li>
<li><b>ターゲット：</b> 10種類の細菌（大腸菌やピロリ菌、サルモネラ菌など）のいずれか。</li>
<li><b>評価指標：</b> <b>Accuracy（正解率）</b></li>
</ul>
<p>数値の意味としては、単なる割合ではなく「理論上の期待値（ランダムな発生確率）からのズレ」を示しており、プラスならその細菌特有の出現パターン、マイナスなら滅多に出現しないパターンを意味します。</p>
<h3 style="color: blue;">2. 実装したベースラインコード</h3>
<p>以前挑戦した「Digit Recognizer（手書き数字認識）」と同じ<b>多クラス分類（multiclass）</b>の枠組みを適用しました。文字列の細菌名を <code>LabelEncoder</code> で数値（0〜9）に変換して学習させ、最終的な予測時に元の細菌名へ復元して提出ファイルを作成します。</p>
<pre style="background-color: #2d3748; color: #fff; padding: 15px; border-radius: 5px; font-family: monospace; font-size: 0.9em; overflow-x: auto; line-height: 1.5; white-space: pre;">import pandas as pd
import numpy as np
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
import lightgbm as lgb
import warnings

warnings.filterwarnings("ignore")

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

# 不要なID列の除去と目的変数の分離
X = train.drop(columns=['row_id', 'target'])
y_raw = train['target']
X_test = test.drop(columns=['row_id'])

# ターゲット（文字列の細菌名）を0〜9の数値に変換
le = LabelEncoder()
y = le.fit_transform(y_raw)

# 2. パラメータ設定（10クラスの多クラス分類）
params = {
    'objective': 'multiclass',
    'num_class': 10,
    'metric': 'multi_logloss',
    'verbosity': -1,
    'boosting_type': 'gbdt',
    'learning_rate': 0.1,
    'random_state': 42
}

# 3. Stratified K-Foldによる5分割交差検証
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
oof_preds = np.zeros((len(train), 10))
test_preds = np.zeros((len(test), 10))

print("Starting Cross Validation...")
for fold, (train_idx, val_idx) in enumerate(skf.split(X, y)):
    X_train, y_train = X.iloc[train_idx], y[train_idx]
    X_val, y_val = X.iloc[val_idx], y[val_idx]
    
    model = lgb.LGBMClassifier(**params, n_estimators=1000)
    
    model.fit(
        X_train, y_train,
        eval_set=[(X_val, y_val)],
        callbacks=[lgb.early_stopping(stopping_rounds=50, verbose=False)]
    )
    
    oof_preds[val_idx] = model.predict_proba(X_val)
    test_preds += model.predict_proba(X_test) / skf.n_splits
    print(f" Fold {fold + 1} finished.")

# 4. 手元スコア（Accuracy）の算出
oof_classes = np.argmax(oof_preds, axis=1)
cv_accuracy = accuracy_score(y, oof_classes)

print("\n" + "=" * 30)
print(f"手元での交差検証スコア（Accuracy）: {cv_accuracy:.5f}")
print("=" * 30)

# 5. 提出用ファイルの作成
test_classes_num = np.argmax(test_preds, axis=1)
test_classes_str = le.inverse_transform(test_classes_num)  # 数値を元の細菌名に戻す

submission = pd.DataFrame({
    'row_id': test['row_id'],
    'target': test_classes_str
})
submission.to_csv('submission_tps_feb2022_lgb.csv', index=False)
print("Submission file created: submission_tps_feb2022_lgb.csv")
</pre>
<h3 style="color: blue;">3. 実行結果：衝撃のスコアギャップ</h3>
<p>Macのローカル環境でコードを実行し、手元の交差検証スコア（CV）を確認したところ、驚くべき高精度を記録しました。しかし、作成した <code>submission_tps_feb2022_lgb.csv</code> をKaggleにLate Submitした結果は大きく異なるものでした。</p>
<pre style="background-color: #2d3748; color: #fff; padding: 15px; border-radius: 5px; font-family: monospace; font-size: 0.95em; overflow-x: auto; line-height: 1.4;">Loading data...
Starting Cross Validation...
 Fold 1 finished.
 Fold 2 finished.
 Fold 3 finished.
 Fold 4 finished.
 Fold 5 finished.

==============================
手元での交差検証スコア（Accuracy）: 0.99553
==============================
Submission file created: submission_tps_feb2022_lgb.csv
</pre>
<div style="text-align: center; margin: 20px 0;"><span style="font-size: 1.5em; font-weight: bold; color: #d9534f; border: 2px solid #d9534f; padding: 10px; border-radius: 5px;"> Kaggle Leaderboard 正解率（Accuracy）：0.93937 / 0.94192 </span></div>
<h3 style="color: blue;">4. 考察とエンジニアとしての気づき</h3>
<p>手元でのCVが<b>0.99553（約99.5%）</b>という完璧に近い数値を出していたのに対し、本番のリーダーボード（LB）では<b>0.93937</b>まで急降下するという大きな乖離が発生しました。これこそが、このコンペに潜む<b>「データ重複の罠」</b>です。</p>
<ul>
<li><b>リークによる過学習：</b> このデータセットには全く同じ値を持つ行（重複データ）が多数含まれています。通常の <code>StratifiedKFold</code> で分割すると、同じデータが「学習用」と「検証用」の両方に分散して入り込んでしまい、モデルが答えを暗記してCVが跳ね上がっていました。</li>
<li><b>多クラス分類の速度感：</b> 前回のMoA（マルチラベル）と比べ、10クラスの「multiclass」として1回の実行で済むため、20万行の処理もローカル環境で非常にスムーズでした。</li>
</ul>
<p>「手元のCVを盲信してはいけない」というKaggleの洗礼を綺麗に浴びる形となりましたが、課題（原因）は明確です。次回はこの「重複データの除外」と「サンプルの重み付け（sample_weight）」を導入し、手元の検証環境を正しく修正した上で本番スコアの大幅更新を狙います。</p>
<hr />
<p style="font-style: italic; color: #666;">次回は、重複行の処理とサンプルの重み付けを実装し、Kaggle本番スコア0.98オーバーへの到達を目指します。<br />
<br />
</p>]]> 
    </content>
    <author>
            <name>吟遊詩人</name>
        </author>
  </entry>
</feed>