機械学習

Networkxのグラフのクラスタリング(コミュニティ)

  目次 1. Networkxのクラスタリング(コミュニティ) 1.1 コミュニティとは 1.2 ガーバンニューマンのアルゴリズム 1.3 クラスタリング係数 2. 実験 2.1 環境準備 2.2 データ準備 2.3 ガーバンニューマンのアルゴリズム 2.4 クラスタリング係数 1. Networkxのクラスタリング(コミュニティ) 1.1 コミュニティとは コミュニティは、接続されたノードの集まりです。 コミュニティ内のノードは密に接続されていますが、中でのクラスタリング結果されたものを指します。 1.2 ガーバンニューマンのアルゴリズム コミュニティを見つけるアルゴリズムの中に、ガーバンニューマン(GirvanNewma) アルゴリズムというものがあります。 ネットワーク内のエッジを段階的に削除することにより、コミュニティを識別します。 中間性を「エッジ中間性」と呼びます。 これは、このエッジを通過するノードのペア間の最短パスの数に比例するスコアです。 このアルゴリズムの手順は次のとおりです。 ネットワーク内の既存のすべてのエッジの中間性を計算します。 中間が最も高いエッジを削除します。 このエッジを削除した後、すべてのエッジの間隔を再計算します。 エッジがなくなるまで、手順2と3を繰り返します。   1.3 クラスタリング係数 ローカルクラスタリング係数は、ノードiを中心とする三角形の数とノードiを中心とする三角形の数の比率です。 ある意味で、ノードiとその隣接ノードが完全グラフにどれだけ近いかを測定します。 実際の例としては、ノードαがノードβとノードγのどちらにも繋がっており、さらにノードβとノードγに繋がっている時だと三角形αβγが形成されています。このような三角形を多く含むネットワークは「クラスターの密度が高い」と考えていくのがこのローカルクラスタリングの考え方です。 これを全体として求めるのがグローバル係数であり、グラフ内の三角形(ローカルクラスター)の密度を測定します。   2. 実験 環境:Google Colab (networkxのパッケージがインストールしている) データセット:networkxのFlorentine Families:結婚の絆によって、ルネッサンスのフィレンツェの家族間の同盟を描いたフィレンツェの家族のグラフです。 モデル:ガーバンニューマンのアルゴリズム   …

Networkxのグラフのクラスタリング(コミュニティ) Read More »

半教師あり学習

  目次 1. 半教師あり学習の概要 1.1 半教師あり学習とは 1.2 ラベル拡散法 (label spreading) 2. 実験 2.1 環境準備 2.2 データ準備 2.3 ラベル拡散法モデル学習 2.4 分類モデル学習 2.5 まとめ   1. 半教師あり学習の概要 1.1 半教師あり学習とは 半教師あり学習(Semi-Supervised Learning)とは教師あり学習と教師なし学習を組み合わせて学習する方法です。教師あり学習はラベル付きデータでモデルを作成します。例えば、ネゴの画像と犬の画像の分類問題です。教師なし学習はラベルなしデータでモデルを作成します。例えば、複数画像の特徴から、クラスターを作成します。 1.2 ラベル拡散法 (label spreading) 正確なモデルを予測するための十分なラベル付きデータがなく、より多くのデータを取得するための能力またはリソースがない場合は、半教師あり手法を使用してトレーニングデータの規模を大きくすることができます。半教師あり学習アルゴリズムを使用してデータにラベルを付け、新しくラベルが付けられたデータセットでモデルを再トレーニングします。   scikit-learnにはラベル拡散法 (label spreading) が実装されており,あるデータのラベルを予測する事によってラベルのないデータにコピーする (伝播させる) ことで,少量のラベル付きデータからモデルを学習します。   sklearn.semi_supervised.LabelSpreading(kernel=’rbf’, *, gamma=20, n_neighbors=7, alpha=0.2, max_iter=30, tol=0.001, n_jobs=None) 2. 実験 データセット:iris (アヤメの種類と特徴量に関する分類データセット) モデル:ラベル拡散法 (label spreading) ⇒ランダムフォレスト モデル評価;Accuracy   2.1 環境準備 …

半教師あり学習 Read More »

Networkxのネットワーク類似度

  目次 1. NetworkXの概要 2. NetworkXの類似性の測定 3. 実験 ・NetworkX環境設定 ・共通部分のノードとエッジの可視化 ・Jaccard係数の集合の類似度 ・graph_edit_distance ・optimal_edit_paths ・optimize_graph_edit_distance ・simrank_similarity 1. NetworkXの概要 NetworkXは、グラフ/ネットワークの作成、加工、構造分析をのPythonのパッケージです。そもそも、数学者、物理学者、生物学者、コンピューター科学者、社会科学者などの分野で活用されています。ソーシャル ネットワーク、分子グラフ、通信ネットワーク、物流ネットワーク、エネルギーネットワークなどの分析を対応します。 このライブラリは多くの機能があり、今回はネットワーク類似度を解説します。   2. NetworkXの類似性の測定(編集距離) グラフ編集距離は、2つのグラフを同形にするために必要なエッジ/ノードの変更の数です。 デフォルトのアルゴリズムは、正確な値ではなく近似値を用いています。 理由は、正確なグラフ編集距離(Graph Edit Distance – GED)における計算の問題は、多くの場合時間がかかります。 グラフ編集距離の例 四角のグラフは三角のグラフに編集は以下の図のような4つステップです。この時は、距離4です。 NetworkXのsimilarityのモジュール: graph_edit_distance(G1, G2[, node_match, …]) グラフG1とG2の間のGED(グラフ編集距離)を返します。 optimal_edit_paths(G1, G2[, node_match, …]) G1をG2に変換するすべての最小コストの編集パスを返します。 optimize_graph_edit_distance(G1, G2[, …]) グラフG1とG2の間のGED(グラフ編集距離)の連続近似を返します。 optimize_edit_paths(G1, G2[, node_match, …]) GED (graph edit distance) …

Networkxのネットワーク類似度 Read More »

ハミングとMLIPNSの文字列の距離

目次 1. ハミング(Hamming) 1.1 ハミングとは 1.2 ハミングのコード例 2. MLIPNS距離 2.1 MLIPNSとは 2.2 MLIPNSのコード例   関連記事: Pythonでの文字列の距離や類似性 距離と類似度の解説   前回はPythonでの文字列の距離や類似性について解説しました。今回の記事はHammingとMLIPNSを解説したいと思います。   1. ハミング(Hamming) 1.1 ハミング距離とは ハミング距離はHamming distanceの英語略称で、等しい文字数を持つ二つの文字列の中で、対応する位置にある異なった文字の個数です。例えば、 「101」と「100」の距離は、1です。 「make」と「made」の距離は、1です。 「job」と「jab」の距離は、1です。 あくまでも異なるかどうかでしか見ないため意味合い等は見る事は当然できません。ただしデータの誤り検知のような確実に同じと思われるような所で使われます。   1.2 ハミングのコード例 TextDistanceのライブラリでハミング距離を計算します。 すべてのアルゴリズムには、いくつかの一般的な方法があります。 .distance(* sequences)-シーケンス間の距離を計算します。 .similarity(* sequences)-シーケンスの類似性を計算します。 .maximum(* sequences)-距離と類似性の可能な最大値。 distance + similarity == maximum .normalized_distance(* sequences)-シーケンス間の正規化された距離。 戻り値は0と1の間の浮動小数点数です。ここで、0は等しいことを意味し、1は完全に異なることを意味します。 .normalized_similarity(* sequences)-シーケンスの正規化された類似性。 戻り値は0と1の間の浮動小数点数です。ここで、0は完全に異なることを意味し、1は等しいことを意味します。   init引数: qval–シーケンスをqグラムに分割するためのq値。 …

ハミングとMLIPNSの文字列の距離 Read More »

Pythonでの文字列の距離や類似性

  目次 1.TextDistanceのライブラリ 2.文字列の距離や類似性のアルゴリズム 2.1 編集ベース(Edit based) 2.2 トークンベース(Token based) 2.3 順序ベース(Sequence based) 2.4 圧縮ベース(Compression based) 2.5 音声ベース(Phonetic based) 2.6 シンプルアルゴリズム(Simple algorithm)   前回は距離と類似度について解説しました。今回の記事は文字列の距離や類似性を解説したいと思います。文字列類似性アルゴリズムは、ドメインに分類できます。 記事:距離と類似度の解説 1.TextDistanceのライブラリ Pythonは文字列の距離を計算するTextDistanceのライブラリがあります。TextDistanceは多くのアルゴリズムによって2つ以上のシーケンス間の距離を比較するためのPythonライブラリです。 特徴: ・30以上のアルゴリズム ・純粋なPythonの実装 ・簡単な使い方 ・比較する3つ以上のシーケンス ・一部のアルゴリズムでは、1つのクラスに複数の実装があります。 ・最高速度のためのオプションのnumpyの使用法。   ライブラリのインストール !pip install textdistance 詳細:https://pypi.org/project/textdistance/   2.文字列の距離や類似性のアルゴリズム   2.1 編集ベース(Edit based) 編集ベースアルゴリズムは、ある文字列を別の文字列に変換するために必要な操作の数を計算しようとします。 操作の数が多いほど、2つの文字列間の類似性は低くなります。 この場合、文字列のすべてのインデックス文字に同等の重要性が与えられることに注意してください。   編集ベースアルゴリズムの一覧 Algorithm Class Functions Hamming Hamming hamming …

Pythonでの文字列の距離や類似性 Read More »

sktimeの時系列分類アルゴリズム

  目次 1.距離ベース(Distance-based) 2.間隔ベース(Interval-based) 3.辞書ベース(Dictionary-based) 4.頻度ベース(Frequency-based) 5.シェイプレットベース(Shapelet-based) 6.ハイブリッド(Hybrid)   一般的な分類アルゴリズムはデータの時間順序に含まれる情報を無視します。時系列分類アルゴリズムは、時系列分類の問題に対して表形式の分類器よりもパフォーマンスが優れている傾向があります。 sktimeには、時系列分類のための多くのアルゴリズムがあります。この記事は時系列分類アルゴリズムの5つのカテゴリを紹介します。   1.距離ベース(Distance-based ) これらの分類アルゴリズムは、距離メトリックを使用して分類します。   K-Nearest Neighbors (Dynamic Time Warping) 代表的なk最近傍(KNN)アルゴリズムは、ユークリッド距離メトリック(Euclidean distance) をdynamic time warping(DTW)メトリックに置き換えることにより、時系列に適合させることができます。DTWは、時間、速度、または長さが正確に一致しない可能性がある2つのシーケンス間の類似性を測定します。   メリット KNN+DTWは、シンプルでよい結果であり、ハイパーパラメータ調整を必要がありません。ベンチマークのベースアルゴリズムとしてよく利用します。   デメリット KNN+DTWは、計算に多くのスペースと時間を必要とします。 シリーズが特定のクラスに割り当てられた理由に関する限られた情報を提供します。 ノイズの多いデータはパフォーマンスが低下する可能性があります。   DTW(Dynamic Time Warping)動的時間伸縮法の記事 LINK   2.間隔ベース(Interval-based ) 時系列フォレスト分類(Time Series Forest Classifier) 時系列フォレスト(TSF)分類は、ランダムフォレスト分類器をシリーズデータに適合させます。下記のような計算を行います。 ランダムな開始位置とランダムな長さで、シリーズをランダムな間隔に分割します。 各区間から特徴量(平均、標準偏差、および勾配)を抽出します。 抽出された特徴量で決定木を学習します。 必要な数のツリーが構築し、学習時間が終わるまで、手順1〜3を繰り返します。 新しいデータは、モデルのすべての木の過半数の投票に従って分類されます。   メリット 実験的研究により、時系列フォレストは、動的なタイムワーピングを伴う最近傍などのベースラインよりも優れていることが示されています …

sktimeの時系列分類アルゴリズム Read More »

sktimeの時系列予測

目次 1. sktime 2. 実験: _2.1 環境構築 _2.2 データロード _2.3 モデル学習 _2.4 予測 _2.5 モデル評価   1. sktime Sktimeとはオープンソースのscikit-learns互換の時系列アルゴリズムのPythonライブラリです。時系列関連のタスクを使用した機械学習の統合インターフェースを提供します。これらのタスクは、次のような学習ベースのタスクと密接に関連しています。 時系列予測 時系列回帰 時系列分類 ディープラーニングについては、コンパニオンパッケージsktime-dlを参照してください。 https://github.com/sktime/sktime-dl   今回の記事は時系列分類を開設したいと思います。   2. 実験: 環境:Colab データセット:BasicMotions データセットは、4つのアクティビティのスマートウォッチから生成されます。 参加者は、ウォーキング、休憩、ランニング、バドミントンの動きを記録する必要がありました。 データは、10秒間、10分の1秒ごとに1回記録されます。 http://www.timeseriesclassification.com/description.php?Dataset=BasicMotions   2.1 環境構築 ライブラリをインストールします。 !pip install sktime   ライブラリをインポートします。 import numpy as np from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sktime.classification.compose import ( ColumnEnsembleClassifier, TimeSeriesForestClassifier, ) from sktime.classification.dictionary_based import BOSSEnsemble from sktime.classification.shapelet_based import MrSEQLClassifier from sktime.datasets import load_basic_motions from sktime.transformations.panel.compose import ColumnConcatenator   2.2 データロード …

sktimeの時系列予測 Read More »

RolexBoostの解説

目次 1. RolexBoostの概要 _1.1 RolexBoostとは _1.2 RolexBoostのアルゴリズム _1.3 RolexBoostのモデル評価 2. 実験 _2.1 環境準備 _2.2 データロード _2.3 RolexBoostモデル作成 _2.4 decision treeモデル作成 _2.5 モデル評価 1. RolexBoostの概要 1.1 RolexBoostとは モデルRolexBoostは Rotation-Flexible AdaBoostの略称で、新しい高い精度のアンサンブルのモデルです(RandomForestの亜種です)。RolexBoostはAdaBoostの拡張であり、違いは、適応損失関数を採用することでAdaBoostのパフォーマンスを向上させます。 ハイパーパラメーターは、指数損失の感度を制御します。これにより、各反復で最適な損失関数を特定できます。 RolexBoostは、柔軟な重み更新システムを使用して、範囲外のデータポイントに対してより堅牢な強力な分類器を構築します。 1.2 RolexBoostのアルゴリズム トレーニングデータDtr = {(x1、y1、…)、(xm、ym)}ここで、X = {x1、…、xm}およびY = {y1、…、ym}はそれぞれ説明変数、被説明変数に対応しています。 L:ブートストラップサブサンプルの数 S:部分空間の数 T:反復回数(基本分類子) K:指数損失関数の感度を制御するハイパーパラメーター トレーニングプロセス l = 1からLまで XをS個の部分空間にランダムに分割します:Xl、s s = 1からSの場合 ブートストラップXl、s:X’l、s PCAをX’l、sに適用し、主成分係数を抽出します:Rl、s   …

RolexBoostの解説 Read More »

異常検出アルゴリズム Isolation Forest

目次 1. Isolation Forestとは 2. scikit-learnのIsolationForest 3. 実験 _3.1 データ作成 _3.2 IsolationForestモデル作成 _3.3 モデル評価 1. Isolation Forestとは Isolation Forestは、他の一般的な外れ値検出方法とは異なり、通常のデータポイントをプロファイリングする代わりに、異常を明示的に識別(分類)します。 Isolation Forestは、他のランダムフォレストと同様に、決定木に基づいて構築されます。最初に特徴量をランダムに選択し、選択した特徴量の最小値と最大値の間でランダムな分割値を選択することによって、パーティションが作成されます。 異常データは通常の観測よりも頻度が低く、値の通常の点とは異なります。 そのため、このようなランダムパーティションを使用することで、必要な分割を減らして、ツリーのルートに近い場所でそれらを識別する必要があります。 距離が異常スコアを表し、距離が小さい=異常スコアが高いものです。異常な外れ値的データ点は、早い段階で(木の浅い段階で)分割される確率が高くでてきます。 論文:https://ieeexplore.ieee.org/document/4781136 異常スコアの計算式 異常な値をもつデータはたしかに早い段階でisolateされますが、その平均深さをそのままではなく、その木でふつうに二分探索する際の平均深さ c(n)c(n) で正規化しています。そのため異常スコアを(0,1)区間に収めているため扱いやすくなります。確率値s(x, n)が、1に近いと異常値、0.5に近いと正常値と見なせるようになります。 2. scikit-learnのIsolationForest https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.IsolationForest.html sklearn.ensemble.IsolationForest(*, n_estimators=100, max_samples=’auto’, contamination=’auto’, max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False) n_estimatorsint, default=100 アンサンブル内の基本推定量の数   max_samples“auto”, int or float, default=”auto” 各基本推定量をトレーニングするためにXから抽出するサンプルの数。   contamination‘auto’ …

異常検出アルゴリズム Isolation Forest Read More »

PyCaret(オープンソースの自動機械学習:AutoML)

目次 1. PyCaretとは 2. 実験: _2.1 環境構築 _2.2 データロード _2.3 モデル比較 _2.4 モデル作成 _2.5 モデルチューニング _2.6 モデル評価 _2.7 モデルのデプロイ _2.8 モデルの保存 _2.9 モデルのロード 1. PyCaretとは PyCaretは、機械学習ワークフローを自動化するPythonのオープンソースのローコード機械学習ライブラリです。 これは、データサイエンスにおいてモデル比較を指数関数的にスピードアップし、生産性を向上させるエンドツーエンドの機械学習およびモデル管理ライブラリーです。 PyCaretのモジュールは下記になります。 – 分類 Classification – 回帰 Regression – クラスタリング Clustering – 異常検出 Anomaly Detection – 自然言語処理(NLP  Natural Language Processing) – アソシエーションルール Association Rules – データセット 今回の実験はバイナリ分類を実験したいと思います。 https://pycaret.readthedocs.io/en/latest/index.html 2. 実験: 環境:Google colab データセット:UCIのmushroomキノコが食べられるか食べられないかのデータです。 e=edible,p=poisonousなどという頭文字だけのcsvデータです。 …

PyCaret(オープンソースの自動機械学習:AutoML) Read More »