東京都のAI分析は「自称分析」?プロンプトとコードから見えた「思考の放棄」

AIでSNS等の情報を集約すればそれが「民意」なのか? なか2656氏が"AIでSNS等の情報を集約すればそれが「民意」なのか?“で纏めているので、考えてみる。結論を先に言ってしまうと、それは民意らしき何かであっても、民意ではない。私は法的ではなく技術的な側面から見て行こう。 AIによる集約 AIによる、要約と言うのは単純なText-to-textのタスクである。つまり、SNSからExtractされたテキストの羅列からそれに続く何らかのテキストを作る行為だ。 問題は、モデルの傾向は適正なのかと、seedの影響と言う二つの側面があり、そのアウトプットは民意なるものを適正にアウトプットしたものとは到底言えないと言える。 民意とは何か そもそも、民意とは何だろうか、数だろうか密度だろうか、おそらく、何れでもない。民主主義における合意は多数決とイコールではない。民主主義における多数決とは合意できないときのフォールバックルートに過ぎない。 従って、少数の意見でも、細大漏らさず、拾い上げなくては民意たりえないのは明白である。そして、そんなことは現状のAIモデルでは不可能だ。そもそも、何が拾われて、何が拾われないかはブラックボックスであり決定すらもない。つまり、透明性が絶対的にない。 従って、少なくとも、民意なるものの抽出には適正とは言い難い。 透明性のある抽出 従って、現実問題を言えば、旧来型のテキストマイニングの方がまだ、この場合はマシである。問題はあっても、透明性がある。つまり、単純にテキストを形態素解析して単語レベルでカウントする。全部を列挙すれば失われる情報はないはずである。共起分析もいいだろう。 AIと異なり、従来型のテキストマイニングは文脈の理解ができるわけではなく、感情の理解もできないが、民意」のように、透明性と説明責任が求められる領域においては、単なる効率性だけでなく、手法の妥当性や信頼性も考慮する必要がある。つまり、なぜ、そのアウトプットが出たのか説明できないようでは有用性を有害性は上回るリスクが否定できない。 まとめ AIによるSNS情報の集約は、世の中のトレンドや大まかな意見の傾向を把握するには有用かもしれませんが、それを「民意」と呼ぶには、ご指摘の通り、技術的な側面から見て多くの課題が残る。 Appendix なか2656氏の記事が2050東京戦略(案)のブロードリスニングを参照しているので、これを解析する。なお、この解析は東京都の公開しているコードを参照してのものである。 分析の概略 この分析は図示すると以下のような流れになっている。 graph TD A[1. データ取得] --> B(2. 埋め込みベクトルへの変換) B --> C[3. 次元削減] C --> D[4. クラスタリング] データ取得で何らかの方法で、SNSからポストを取得し、それをOpenAIのGPT系の何れかの埋め込みモデルで埋め込みベクトルに変換する。これにより、例えば、 2050年代の東京では、中学生や高校生の始業時間を遅らせてほしいです。思春期の子供たちは夜型の脳になるため、朝早くからの授業では頭がついていけないそうです。 のようなコメントは、\( [1,2,3,4] \)のような多次元のベクトルに変換される。これを次元削減して、2次元のベクトルに縮約する。これは二次元の平面上に表示するためだ。この分析ではアルゴリズムとしてUMAPが使用されている。 これを、クラスタリング手法によって、幾つかのグループにまとめる。東京都のコードではスペクトラルクラスタリングとHDBSCANが併用されている。 正確には HDBSCANによって、密度の高い領域を、クラスターとして抽出して、スペクトラルクラスタリングで最終的なクラスタを作成している。そして、クラス数はコードを読む限り6とハードコードされている。 モジュール 方法 Embedding GPT系埋め込みモデル ベクトル縮約 UMAP クラスタリング HDBSCAN クラスタリング Spectral Clustering ラベリング CountVectorizer 分析の問題 あるべき分析の戦略 データ分析の代表的なフレームワークである、CRISP-DMによれば、以下のような流れで分析は進めるべきとされている。 graph TD A[1. ビジネス理解] --> B(2. データの理解) B --> C[3. データ準備] C --> D[4. モデリング] D --> E[5. 評価] E --> F[6. 実装] プロンプトはどこから来たのか この分析で作成に使ったと思われるプロンプトが開示されている。 ...

9月 5, 2025 · 1 分 · 140 文字 · gorn

Record of Signate War

“採血データを使った心不全予測"のコンペに参加したので、解法を示します。まず、基本的に、2つの分類の予測問題は元々慣れていたので基本的なフレームとしては以下の通りです。 探索的データ分析 ベースラインモデルの作成 予測モデルの作成 探索的データ分析 まず、最初にデータを一応概観してみました。 発売中の技術同人誌 “Pythonによる探索的データ分析クックブック“でも触れている、ydata-profilingを使用しています。 import os import sys import pandas as pd import polars as pl import pyarrow as pa import numpy as np import matplotlib.pyplot as plt import seaborn as sns from ydata_profiling import ProfileReport train_df = pd.read_csv("../data/train.csv") test_df = pd.read_csv("../data/test.csv") profile = ProfileReport(train_df, title="Heart Failure Report") profile.to_file("../profile/heart_failure_report.html") ベースラインモデルの作成 基本線となるベースラインモデルを作成しました。ベースラインモデルは文字通りベースラインモデルなので、複雑なものは避けるのがセオリーです。今回は二つの分類をするタイプなので、一般化線形回帰でロジスティック回帰に持ち込むのを基本としました。また、stepwiseなどの容易さから、一旦、Rでモデリングを進めました。 コードとしては以下のシンプルきわまるものです。 require(dplyr) require(readr) require(ggplot2) require(pROC) train.df <- read.csv("../data/train.csv") test.df <- read.csv("../data/test.csv") train.df <- train.df %>% mutate( anaemia = as.factor(anaemia), diabetes = as.factor(diabetes), high_blood_pressure = as.factor(high_blood_pressure), sex = as.factor(sex), smoking = as.factor(smoking), target = as.factor(target) ) require(MASS) model <- glm(formula = target ~ age + anaemia + creatinine_phosphokinase + diabetes + ejection_fraction + high_blood_pressure + platelets + serum_creatinine + serum_sodium + sex + smoking + time, data = train.df, family = binomial) model.opt <- stepAIC(model) pred.df <- predict(model.opt, train.df, type = "response") roc_curve <- roc(train.df$target, pred.df) auc_value <- auc(roc_curve) ar_value <- (auc_value - 0.5) * 2 print(paste("AR値:", ar_value)) cat("Length of Cumulative_Percentage:", length(seq(0, 1, length.out = nrow(train.df))), "\n") cat("Length of Predicted_Positive:", length(sort(pred.df, decreasing = TRUE)), "\n") cat("Length of Actual_Positive:", length(sort(as.numeric(train.df$target), decreasing = TRUE)), "\n") sorted_predictions <- sort(pred.df, decreasing = TRUE) # 予測確率を降順に sorted_targets <- sort(as.numeric(as.character(train.df$target)), decreasing = TRUE) # 実ターゲットを降順に n <- min(length(sorted_predictions), length(sorted_targets)) cumulative_data <- data.frame( Cumulative_Percentage = seq(0, 1, length.out = n), Predicted_Positive = cumsum(sorted_predictions[1:n]), Actual_Positive = cumsum(sorted_targets[1:n]) ) ggplot(cumulative_data, aes(x = Cumulative_Percentage)) + geom_line(aes(y = Predicted_Positive, color = "モデル予測")) + geom_line(aes(y = Actual_Positive, color = "実データ")) + scale_y_continuous(name = "累積正例率", limits = c(0, max(cumulative_data$Predicted_Positive, cumulative_data$Actual_Positive))) + scale_x_continuous(name = "累積パーセンテージ", limits = c(0, 1)) + labs(title = "CAP図") + theme_minimal() 最終的には以下のCAP図になりました、 ...

5月 2, 2025 · 5 分 · 1037 文字 · Me