Introduction to ML with Python

Pyhton3

export PATH="/home/tkobayas/anaconda3/bin:$PATH"

Jupyter Notebook

cd /home/tkobayas/usr/git/amueller/introduction_to_ml_with_python

jupyter notebook

 

Supervised Learning

Classifier と Regressor

  • k-NN (k-Nearest Neighbors)
    k個の近いやつを拾う。訓練はデータを格納するだけ。予測に時間がかかる
  • Linear Regression (ordinary least squares : OLS)
    二乗誤差(mean squared error) が最小になるように w (係数: coefficient) と b (切片: intercept) を求める。
  • Ridge
    L2正則化 (regularization) で w を小くし、汎化性能を上げる
  • Lasso
    L1正則化
  • Logistic Regression
    (TODO)
  • Linear Support Vector Machines: SVM
    (TODO)
  • Naive Bayes Classifiers
    (TODO)
  • Decision Trees
    2分木の繰り返し。depthを調整して汎化。外挿(extrapolate)ができない、つまり訓練データのレンジの外側に対しては予測できない
  • Random Forests
    featureやデータを減らした条件で複数のDecision Treeを生成し、組み合わせる(それぞれの確率予測を平均し、最も高いものに決定)
  • Gradient Boosted Regression Trees (勾配ブースティング回帰木)
    1つ前のDecision Treeの誤りを次のDecision Treeが修正するようにして、Decision Treeを順番に作っていく
  • Kernelized Support Vector Machines
    非線形特徴量を追加する(例:ある特徴量の2乗)。決定境界に重要な一部のデータポイントを Support Vector と呼ぶ。前処理:全ての特徴量が0から1の間になるようにスケール変換する。
  • Neural Network
    多層パーセプトロン(multilayer perceptron: MLP)。隠れユニット(Hidden Unit)による重み付け。活性化関数 RELU、TANH

不確実性の推定

  • Decision Function
    正負で予測クラス、絶対値でそのモデルが信じている度合いが表される
  • Predicting Probabilities
    0から1で確率(確信度)を表す

Unsupervised Learning and PreProcessing

前処理、スケール変換

  •  StandardScaler など

次元削減、特徴量抽出、多様体学習

  • 主成分分析 Principal Component Analysis : PCA
    まず分散が大きい方向を第1成分とする。次に第1成分と直交する方向から、最も情報を持っている方向を探し、第2成分とする。以下繰り返す。
    主成分のいくつかだけを残すことで次元削減にも使える。
    例えば顔認識に使う時、画像を各ピクセル(特徴量)ではなく、PCA変換後の各主成分の重み付き和で表現する、つまり別の特徴量で表現する。
  • 非負値行列因子分解 Non-negetive Matric Factorization : NMF
    データを非負の重み付き和に分解する。複数のデータが重ね合わせられた場合(複数楽器の音声データなど)に有効
  • t-SNE
    多様体学習。主に2次元表現にして可視化に用いる。

クラスタリング

  • k-means クラスタリング
    まずランダムにクラスタ重心を決める。個々のデータポイントを最寄りの重心に割り当て、重心位置を再計算する、を繰り返す。クラスタが丸い塊でないと上手く機能しない。
  • 凝集型クラスタリング agglomerative clustering
    個々のデータポイントを個別のクラスタとして開始する。類似したクラスタをマージしていく。「類似」のデフォルトは ward。マージした際にクラスタないの分散の増分が最小になるように2つのクラスタを選択する。これは階層型クラスタリング hierarchical clustering でもある。デンドログラムで階層を見る。
  • DBSCAN (Density-Based Spatial Clustering of Applications with Noise)
    クラスタはデータ中で高密度領域を構成していて、比較的空虚な領域で区切られていると考える。空虚な領域のデータを noise とみなす。クラスタ数を先験的に与える必要がない。
クラスタリングアルゴリズムの比較と評価
  • 調整ランド指数(adjusted rand index : ARI)
  • 正規化相互情報量(normalized mutual information : NMI)

データの表現と特徴量エンジニアリング

Categorical Variables

  • One-Hot-Encoding (Dummy variables)
    カテゴリごとに 0/1 の特徴量に置き換える。連続性のない数値データもワンホットエンコードする

 Binning, Discretization, Linear Models, and Trees

  • Binning/Discretization
    連続量を等間隔(ビン)に区切り、複数の離散値にし、ワンホットエンコーディングする。線形モデルに適用すると表現力が上がる場合がある。
  • 交互作用特徴量(interaction feature)
    2つの特徴量の積を特徴量として加える
  • 多項式特徴量(polynominal deature)
    特徴量の2乗、3乗 ... を特徴量として加える。Linear Regression と組み合わせると、Polynominal Linear Regression となる。スムーズに適合するようになる。

単変量非線形変換 Univariate Nonlinear Transformation

  •  log, exp はスケール変換で有用。sin,cos は周期的なパターンに有用。

自動特徴量選択

特徴量が多すぎると過剰適合の可能性が高くなる。どのように良い特徴量を選択すればよいか?

  • 単変量統計 univariate statistics
    個々の特徴量とターゲットとの間の統計的関係を計算。高い確信度で関連している特徴量を選択する。モデルの構築が不要
  • モデルベース選択 model-based selection
    教師あり学習モデルを用いて個々の特徴量の重要性を判断。決定木ベースモデルなどを使う。
  • 反復選択 iteratice selection
    再帰的特徴量削減 recursive feature elimination : RFE まず全ての特徴量を使ってモデルを作り、最も重要度が低い特徴量を削減する。そしてまたモデルを作り。。。を繰り返す。

専門家知識の利用

専門家によるレビューで、適切な特徴量を追加する。単なるPOSIX時刻ではなく、時刻や曜日など。

モデルの評価と改良

 交差検証 cross-validation

k-fold cross-validation データをk個に分割して1つをテストデータとし、残りを訓練データにする。kパターンの組合わせで精度を検証できる。

層化k分割交差検証 stratified k-fold cross-validation 各分割内でのクラスの比率が全体の比率と同じになるように分割する。

1つ抜き交差検証 leave-one-out データ1つが1分割に相当する。大量に検証出来る。

グリッドサーチ

各パラメータ(SVMにおける gamma [カーネルのバント幅]、C[正則化パラメータ])の各値でグリッド表にして、比較する。

パラメータ選択用にもう一つ「検証セット」を分ける。つまりデータを training set, validation set, test set に3分割する

評価基準とスコア

最終的な目標を見失わないこと。アプリケーションの高レベルでの目的を考える。

精度が予測性能の尺度として良くない場合がある。結果を true positive (TP), false positive (FP), true negative (TN), false negative (FN)  に分ける。

精度 = (TP+TN) / (TP + TN + FP + FN)

適合率 = TP / (TP + FP) ... 偽陽性を減らしたいときに用いる

再現率 = TP / (TP + FN) ... 偽陰性を避けたいときに用いる(ガン検査など)

f-measure (f-値) = 2 * ( (適合率 * 再現率) / (適合率 + 再現率) ) ... 総合的にまとめて評価。偏った2クラス分類データセットに対しては、精度よりも良い基準となる。

ROCカーブ receiver operating characterristics curve 偽陽性率と真陽性率を軸にしてプロットする。このカーブの下の領域面積 AUC : area under the curve のスコアで評価。偏ったクラス分類問題を評価する基準としては、精度よりもAUCの方がはるかに良い。

回帰の場合、R^2スコア(coefficient of determination)で良い

アルゴリズムチェーンとパイプライン

複数の Estimator をひとつの Pipeline にまとめる(例: MinMaxScaler と SVC)。この pipeline をグリッドサーチに渡せばよい。

(fit -> transform) -> (fit -> transform) -> (fit) とか

(transform) -> (transform) -> (predict) のように呼ばれる

グリッドサーチとパイプラインの組合わせで、例えば RandomForestClassifier と SVC の比較もできる。

テキストデータの処理

Bag of Words (BoW)

単語に分割し、出現回数をカウント。そのまま特徴量として Classifier を訓練できる。

不要な単語などを検出し、特徴量を抽出/削減する。あるいはスケールを調整する。

  • min_df : 最小出現文書数。例えば、1つの文書にしか出現しない単語は評価する意味が無いだろう。
  • ストップワード : 辞書ベースで固有の不要リストを作る。英語だと the, me, など
  • tf-idf (term frequency-inverse document frequency) : 特定の文書に頻出する単語に重みを与える(満遍なく出るような単語は重要では無い)。

n-gram

2つや3つのトークンをまとめる。例えば "not worth" は否定的、"definitely worth", "well worth" は肯定的。

正規化 normalization

  • 語幹処理 stemming : 単語の末尾を取り除き、単語の変化形を共通化する。機械的なので、うまくいかない場合も多い。
  • 見出し語化 lemmatization : 語幹処理よりも複雑な処理で、一般に良い結果が得られる
  • スペルミスの修正など

トピックモデリング、文書クラスタリング

  • LDA (Latent Dirichlet Allocation) : 同時に現れる頻度の高い単語の集合(= トピック)を探す。

その他

  • word2vec : ワードベクタと呼ばれる連続値ベクタ表現を利用
  • RNN (Recurrent Neural Networks) : テキストからテキストを生成。自動翻訳や要約に適している

 

THINK LIKE A FREAK

https://www.amazon.co.jp/Think-Like-Freak-Secrets-Economist/dp/0141980079
行動経済学をベースにひとの考え方の落とし穴や思い込みを解明する、自己啓発本的と言えなくもないけど、とにかく話題が豊富で面白い。

1. What Does It Mean to Think Like a Freak

サッカーのPKで、左右より真ん中を狙う方がゴールの確率が高い、なのになぜキッカーは左右を狙うのか?それは実はプレーヤーにとって、試合の勝利以外にもインセンティブがあるからだ。
私は行動経済学についてはこの本と Freakonomics Radio しか知識が無いけれども、ひとの行動を解き明かすにあたって、「インセンティブ」が重要、というか第一のファクターとして見ているようです。その上で、各章で話が広がっていく。

2. The Three Hardest Words in the English Language

The Three Hardest Words というのは “I don’t know” のこと。確かに言えないことが多いですね。ワインの良し悪し、景気動向予測、イラク大量破壊兵器、実際よく分からないことについていかに多くの人が分からないのに分かったふりをする(または分かった気になる)。我が身を振り返り、戒める。。。あとちゃんとデータを基に判断しようぜっていう話。

3. What’s Your Problem

ホットドッグ早食いチャンピオン、コバヤシタケルの話。大会に突然現れ、過去最高記録の2倍食って優勝した(12分で50本)。彼は早食いをスポーツと捉え、そのための戦略を立て、トレーニングした。ポイントは「問題を捉え直す」ということ。Game Changer ですね。これを意識して実践するのはなかなか難しいで。。。

4. Like a Bad Dye Job, the Truth Is in the Roots

次は問題を解決するにあたり、どうやって原因を見つけるか。人は受け入れ難い原因を見過ごしがちになる。中絶法が不幸な出産を減らし犯罪率を下げた、塩分濃度の高い黒人奴隷が選択的にアメリカに連れてこられたために黒人の心臓疾患率が高い、ピロリ菌の発見は既得権益を持つ医師、製薬会社から抵抗された。

5. Think Like a Child

simple に、small に考えようぜという話。中国のある町で、小学生に眼鏡を配ったら視力に問題のあった子は成績が25%から50%向上した。こんな単純なソリューションがあるなんて!貧乏人は貯金しないのに宝クジは買う傾向がある(一発逆転を夢見たい)。でも彼らに必要なのは貯金だ.じゃあ宝クジつき預金にしよう(当選金の原資は利子)

6. Like Giving Candy to a Baby

インセンティブ」について掘り下げる。単純に報酬を与えれば人は動くのか?人が省エネを実行する一番の動機はなんだろう(答え:他のみんながやってるから)。NPO活動で寄付金を募る際、寄付してくれた人に継続的に無心するのではなく、「もしあなたが望むなら、一度寄付してくれたらもうメールは送りません」というアプローチの方がトータルでお金が集まる。なぜなら人は関係性をコントロールできることを望むから。
このへん心理学と密接に関わってくるけど、行動経済学としては実験から得たデータを重視するのがポイント。

7. What Do King Solomon and David Lee Roth Have In Common?

うまく仕掛けを作って、相手から適切な情報を引き出す。ヴァンヘイレンはなぜ楽屋に茶色のM&Mがあると暴れるのか。中世の教会裁判で「被告に熱した鉄を触らせる。嘘をついてなければ神様が救ってくれる」という方法がどう機能したのか。
Teach Your Garden to Weed Itself

8. How to Persuade People Who Don’t Want to Be Persuaded

相手を説得する際に気をつけること。この章はちょっとベタかな。大事だけど。そもそも説得は困難であるということ。自分の問題ではなく相手の問題であること。相手を侮辱しないこと。ストーリーを伝えること。

9. The Upside of Quitting

「辞める」ことの効用。なぜ「辞める、諦める」のは難しいのか。「やり続けた人のみ成功する」という美徳。人はこれまでの投資分(sunk cost)を過剰に評価する。辞めることで別のことに投資できる(oppotunity cost)を過小評価しないようにしよう。「辞める、諦める」を美徳とし、早くサイクルを回すことで次の目標に投資できる。ほんとはチャーチルもいろいろ辞めたり投げ出したりしてるんだぜ。

casemgmt殴り書きメモ

jBPM70Ex005_casemgmt

ProcessJPATest.testAddUserTaskToCaseWithStage()

UserTaskCase.bpmn2 : adhoc process
UserTaskWithStageCase.bpmn2 : adhoc process

casemgmt is operated by service classses:

  • org.jbpm.casemgmt.impl.CaseServiceImpl
    • org.jbpm.casemgmt.impl.CaseRuntimeDataServiceImpl
  • CaseFileInstance caseFile = caseService.newCaseFileInstance(deploymentUnit.getIdentifier(), USER_TASK_CASE_P_ID, data, roleAssignments);
    • get CaseDefinition
    • create CaseFileInstanceImpl
  • String caseId = caseService.startCase(deploymentUnit.getIdentifier(), USER_TASK_STAGE_CASE_P_ID, caseFile);
    • generate caseId
    • processService.execute(StartCaseCommand)
      • addEventListener to capture events for "RuleFlow-AdHocActivate-" rule match
      • Insert caseFile into WorkingMemory
      • FireAllRules
      • startProcess with CorrelationKey(caseId) : processId = caseDefinitionId (so it's "UserTaskWithStageCase")
      • singalEvent for captured events
  • CaseInstance cInstance = caseService.getCaseInstance(caseId);
    • Use
      • Actually, returns the top level process instance for the case id
  • caseService.addDynamicTaskToStage(FIRST_CASE_ID, stage.getId(), caseService.newHumanTaskSpec("First task", "test", "john", null, parameters));
    • processService.execute(AddDynamicTaskToStageCommand)
      • Add a WorkItem
  • Collection caseProcessInstances = caseRuntimeDataService.getProcessInstancesForCase(caseId, new QueryContext());
    • simeply get a prorcessInstance ... runtimeDataService.getProcessInstancesByCorrelationKey()
  • caseService.cancelCase(caseId);
    • processService.execute(CancelCaseCommand)
      • get all process instances
      • abort all process instances
      • if (destory == true), destroy ksession and mapping

===

What is "Stage"?

It's adhoc subprocess in the process.

Thread [main] (Suspended (breakpoint at line 40 in CaseStageImpl))	
	owns: KModuleDeploymentService  (id=85)	
	CaseStageImpl.<init>(String, String, Collection<AdHocFragment>) line: 40	
	CaseRuntimeDataServiceImpl.collectCaseStages(String, String, NodeContainer) line: 728	
	CaseRuntimeDataServiceImpl.onDeploy(DeploymentEvent) line: 167	
	KModuleDeploymentService(AbstractDeploymentService).notifyOnDeploy(DeploymentUnit, DeployedUnit) line: 96	
	KModuleDeploymentService(AbstractDeploymentService).commonDeploy(DeploymentUnit, DeployedUnitImpl, RuntimeEnvironment, KieContainer) line: 163	
	KModuleDeploymentService.deploy(DeploymentUnit) line: 200	
	ProcessJPATest(AbstractCaseServicesBaseTest).prepareDeploymentUnit() line: 223	
	ProcessJPATest(AbstractCaseServicesBaseTest).setUp() line: 186	
	NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]	
	NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62	
	DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43	
	Method.invoke(Object, Object...) line: 497	
	FrameworkMethod$1.runReflectiveCall() line: 50	
	FrameworkMethod$1(ReflectiveCallable).run() line: 12	
	FrameworkMethod.invokeExplosively(Object, Object...) line: 47	
	RunBefores.evaluate() line: 24	
	RunAfters.evaluate() line: 27	
	BlockJUnit4ClassRunner(ParentRunner<T>).runLeaf(Statement, Description, RunNotifier) line: 325	
	BlockJUnit4ClassRunner.runChild(FrameworkMethod, RunNotifier) line: 78	
	BlockJUnit4ClassRunner.runChild(Object, RunNotifier) line: 57	
	ParentRunner$3.run() line: 290	
	ParentRunner$1.schedule(Runnable) line: 71	
	BlockJUnit4ClassRunner(ParentRunner<T>).runChildren(RunNotifier) line: 288	
	ParentRunner<T>.access$000(ParentRunner, RunNotifier) line: 58	
	ParentRunner$2.evaluate() line: 268	
	BlockJUnit4ClassRunner(ParentRunner<T>).run(RunNotifier) line: 363	
	JUnit4TestReference.run(TestExecution) line: 86	
	TestExecution.run(ITestReference[]) line: 38	
	RemoteTestRunner.runTests(String[], String, TestExecution) line: 459	
	RemoteTestRunner.runTests(TestExecution) line: 675	
	RemoteTestRunner.run() line: 382	
	RemoteTestRunner.main(String[]) line: 192