機械学習はデータから有用な洞察を引き出すことができます。目標は、Spark MLlib を使用して適切なアルゴリズムを適用し、データセットから洞察を生成することです。 Twitter データセットでは、教師なしクラスタリング アルゴリズムを使用して、Apache Spark に関連するツイートを区別します。初期入力はツイートの混合物です。 まず、関連する特徴が抽出され、次に機械学習アルゴリズムがデータセットに適用され、最後に結果とパフォーマンスが評価されます。 この章の主なポイントは次のとおりです。 - Spark MLlib モジュールとそのアルゴリズム、および一般的な機械学習プロセスについて学習します。
- 収集された Twitter データセットは、関連する特徴を抽出するために前処理され、教師なしクラスタリング アルゴリズムが適用されて Apache Spark 関連のツイートが識別されます。次に、得られたモデルと結果が評価されます。
- Spark 機械学習パイプラインについて説明します。
アプリケーション アーキテクチャにおける Spark MLlib の位置 まず、データ集約型アプリケーションのアーキテクチャにおけるデータ学習の位置づけについて、分析層、より正確には機械学習に焦点を当てて見てみましょう。これはバッチ データ学習とストリーミング データ学習の両方の基礎であり、推論のルールが異なるだけです。 次の図は要点を示しています。分析レイヤーでは、探索的データ分析ツールである Spark SQL と Pandas、および機械学習モジュールを処理します。 Spark MLlib アルゴリズム分類 Spark MLlib は急速に更新されるモジュールであり、新しいアルゴリズムが常に Spark に導入されています。 次の図は、従来の機械学習技術のシステムまたはデータ連続体に従ってグループ化された Spark MLlib アルゴリズムの概要を示しています。 Spark MLlib アルゴリズムは、データのタイプに基づいて、順序なしまたは連続の 2 つのカテゴリに分けられます。データを順序なしデータと連続データに分けます。定性データの例: 気圧、気温、雲の種類と存在、天気が晴れ、乾燥、雨、曇りのいずれかである場合、彼女が男性用のトップスを着ているかどうかを予測します。これらは離散値です。 一方、場所、住宅面積、部屋数を指定して、住宅の価格を予測したい場合は、線形回帰を使用して不動産を予測できます。 この例では、連続データについて説明します。 レベルのグループ化は、使用される機械学習アルゴリズムの種類を反映します。教師あり機械学習と教師なし機械学習は、トレーニング データにラベルが付けられているかどうかによって異なります。教師なし学習の課題は、ラベルのないデータに対して学習アルゴリズムを使用することです。目標は、入力内の暗黙的な構造を発見することです。 教師あり学習のデータにはラベルが付けられています。 連続データの回帰予測と離散データの分類に重点が置かれています。 機械学習の重要なカテゴリは、主に協調フィルタリング技術を活用する推奨システムです。 Amazon と Netflix には、独自の非常に強力な推奨システムがあります。確率的勾配降下法は、Spark 分散コンピューティングに適した機械学習最適化手法の 1 つです。大量のテキストを処理するために、Spark は TF-IDF、Word2Vec、標準スケーラー、ノーマライザーなどの特徴抽出と変換のための重要なライブラリを提供します。 教師あり学習と教師なし学習 Spark MLlib が提供する従来の機械学習アルゴリズムを詳しく見てみましょう。教師あり機械学習と教師なし機械学習は、トレーニング データにラベルが付けられているかどうかによって異なります。順序なしと連続の違いは、データが離散的か連続的かによって異なります。 次の図は、Spark MLlib の教師ありおよび教師なしアルゴリズムと前処理手法を説明しています。 以下は、Spakr MLlib の教師ありおよび教師なしアルゴリズムと前処理手法です。 - クラスタリング: データにラベルが付けられておらず、データから構造を抽出することを目的とする教師なし機械学習手法。
∞ K平均法: データをK個の異なるクラスターに分割する ∞ ガウス混合分布: 事後確率クラスタリングのコンポーネントベースの最大化 ∞ 累乗反復クラスタリング (PIC): グラフの頂点の2つの辺の類似性に基づくクラスタリング ∞ 潜在ディリクレ分布(LDA):テキスト文書をトピックにクラスタリングするために使用される ∞ ストリーミングK平均法: ウィンドウ関数を使用して、受信データストリームに対してK平均法クラスタリングを動的に実行します。 - 次元削減: 特徴の数を減らすことを目的としています。基本的には、データ内のノイズを減らし、主要な特徴に焦点を当てるために使用されます。
∞ 特異値分解 (SVD): 行列内のデータを単純で意味のある部分に分割し、最初の行列から 3 つの行列を生成します。 ∞ 主成分分析 (PCA): サブスペース内の低次元データを使用して高次元データ セットを近似します。 - 回帰と分類: 分類器は結果をクラスに分類しますが、回帰はラベル付けされたトレーニング データを使用して出力結果を予測します。カテゴリ変数は離散的で順序付けられていませんが、回帰変数は連続的で順序付けられています。
∞ 線形回帰モデル (線形回帰、ロジスティック回帰、サポート ベクター マシン): 線形回帰アルゴリズムは凸最適化問題として表現でき、その目的は重み付き変数のベクトルに基づいて目的関数を最小化することです。 目的関数は、関数の通常部分を通じて関数の複雑さを制御し、関数の損失部分を通じて関数の誤差を制御します。 ∞ ナイーブベイズ: 変数の独立性を基本仮定として、特定のラベルの条件付き確率に基づいて予測が行われます。 ∞ 決定木: 特徴空間の再帰的なバイナリ分割を実行し、ツリーノードの情報ゲインを最大化して最適な分割を実現します。 ∞ ツリーのアンサンブル (ランダム フォレストと勾配ブースティング ツリー): ツリー アンサンブル アルゴリズムは、複数の決定木モデルを組み合わせて、高性能なモデルを構築します。非常に直感的で、分類と回帰に適しています。 - 等温回帰: 与えられたデータと観測された応答の間の二乗平均平方根誤差を最小化します。
その他の学習アルゴリズム Spark MLlib は、他の多くのアルゴリズムも提供します。大まかに言えば、他の機械学習アルゴリズムは 3 つあります。 レコメンデーション システム、最適化アルゴリズム、および特徴抽出。 MLlib で現在利用可能な他のアルゴリズムは次のとおりです。 - 協調フィルタリング: ギャップを埋めることを目的としてユーザーとアイテムの関連マトリックスを作成する、推奨システムの基礎です。他のユーザーやアイテムの評価に基づいて、評価のないターゲットユーザーにアイテムを推奨します。分散コンピューティングでは、ALS (交互最小二乗法) が最も成功したアルゴリズムの 1 つです。
∞ 交互最小二乗法: 行列因数分解技術は、暗黙的なフィードバック、時間効果、信頼レベルを使用して、大規模なユーザー項目行列を低次元のユーザー項目因子に分解し、因子を置き換えることで二次損失関数を最小化します。 - 特徴抽出と変換: これらは大規模なドキュメント処理の基礎であり、次の技術が含まれます。
∞ 用語の頻度: 検索エンジンは TF-IDF を使用してコーパス内のドキュメントをランク付けします。これは、機械学習で文書またはコーパス内の単語の重要度を判断するために使用されます。単語の頻度統計によって決定される重みは、コーパス内での単語の出現頻度によって異なります。 用語の頻度自体は、たとえば the、of、and などの情報価値のない単語を強調しすぎるなど、誤解を招く可能性があります。逆ドキュメント頻度は、特異性または情報価値、つまりコーパス内のすべてのドキュメントで単語がどの程度一般的であるかの尺度を提供します。 ∞ Word2Vec: Skip-Gram と Continuous Bag of Word の 2 つのモデルが含まれます。Skip-Gram は、単語のスライディング ウィンドウに基づいて、特定の単語の隣接する単語を予測します。Continuous Bag of Words は、特定の隣接する単語の現在の単語を予測します。 ∞ 標準スケーラー: 前処理の一環として、データセットは平均除去と分散スケーリングによって標準化されることがよくあります。トレーニング データの平均と標準偏差を計算し、同じ変換をテスト データに適用します。 ∞ ノーマライザー: サンプルをスケーリングするときに正規化します。ドット積やカーネル法などの二次形式に非常に便利です。 ∞ 特徴選択: モデル内で最も関連性の高い特徴を選択することで、ベクトル空間の次元を削減します。 ∞ カイ二乗セレクター: 2 つのイベントの独立性を測定する統計的手法。 - 最適化: これらの Spark MLlib 最適化アルゴリズムは、さまざまな勾配降下法に重点を置いています。 Spark は、分散クラスター上での勾配降下法の非常に効率的な実装を提供し、非常に小さなローカル反復を通じて勾配の急速な降下を完了します。すべてのデータ変数を反復処理すると、計算負荷が増大します。
∞ 確率的勾配降下法: 微分可能な関数の合計である目的関数を最小化します。確率的勾配降下法では、トレーニング データのサンプルのみを使用して特定の反復のパラメーターを更新し、テキスト分類などの大規模なスパース マシン ラーニングの問題を解決するために使用されます。 - 限定メモリ BFGS (L-BFGS): 名前が示すように、L-BFGS は限定メモリを使用し、Spark MLlib に実装された分散最適化アルゴリズムに適しています。
Spark MLlib データ型 MLlib は、ローカル ベクトル、ラベル付きポイント、ローカル マトリックス、分散マトリックスの 4 つのデータ型をサポートしています。Spark MLlib アルゴリズムは、これらのデータ型を広範に使用します。 - ローカル ベクトル: 単一のマシン上に配置され、密または疎になります。
∞ 密ベクトルは従来の double 配列です。たとえば、[5.0, 0.0, 1.0, 7.0] などです。 ∞ スパースベクトルは整数値と倍精度値を使用します。スパースベクトル [5.0, 0.0, 1.0, 7.0] は (4, [0, 2, 3], [5.0, 1.0, 7.0]) となり、ベクトルの次元を示します。 以下は、PySpark でネイティブ ベクトルを使用する例です。 - numpyをnpとしてインポートする
- scipy.sparse をspsとしてインポートします。
- pyspark.mllib.linalgからベクトルをインポートする
-
- # 密なベクトルのNumPy 配列。
- dvect1 = np.array([5.0, 0.0, 1.0, 7.0])
- # 密なベクトルのPython リスト。
- dvect2 = [5.0, 0.0, 1.0, 7.0]
- # SparseVector の作成
- svect1 = Vectors.sparse(4, [0, 2, 3], [5.0, 1.0, 7.0])
- # 単一列のSciPy csc_matrixを使用したスパースベクトル
- svect2 = sps.csc_matrix((np.array([5.0, 1.0, 7.0]), np.array([0,
- 2, 3]))、形状 = (4, 1))
- ラベル付きポイント。ラベル付きポイントは、教師あり学習におけるラベル付きの密または疎なベクトルです。バイナリ ラベルでは、0.0 は負の値、1.0 は正の値を表します。
以下は PySpark でポイントにラベルを付ける例です。 - pyspark.mllib.linalgからSparseVector をインポートします
- pyspark.mllib.regressionからLabeledPoint をインポートします
-
- #正のラベルと密な特徴ベクトルを持つラベル付けされたポイント。
- lp_pos = ラベル付きポイント(1.0, [5.0, 0.0, 1.0, 7.0])
-
- #負のラベルとスパースな特徴ベクトルを持つラベル付きポイント。
- lp_neg = ラベル付きポイント(0.0, スパースベクトル(4, [0, 2, 3], [5.0, 1.0,
- 7.0]))
- ローカル マトリックス: ローカル マトリックスは単一のマシン上に配置され、整数インデックスと double 値を持ちます。
以下は PySpark のローカル マトリックスの例です。 - pyspark.mllib.linalgからMatrix、Matrices をインポートします
-
- # 密行列 ((1.0, 2.0, 3.0), (4.0, 5.0, 6.0))
- dMatrix = Matrices.dense(2, 3, [1, 2, 3, 4, 5, 6])
-
- # スパース行列 ((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
- sMatrix = Matrices.sparse(3, 2, [0, 1, 3], [0, 2, 1], [9, 6, 8])
- 分散マトリックス: RDD の成熟度を利用して、分散マトリックスをクラスター全体で共有できます。分散マトリックスには、RowMatrix、IndexedRowMatrix、CoordinateMatrix、BlockMatrix の 4 種類があります。
∞ RowMatrix: 複数のベクトルの RDD を使用して、RowMatrix と呼ばれる意味のないインデックスを持つ行分散マトリックスを作成します。 ∞ IndexedRowMatrix: 行インデックスは意味を持ちます。まず IndexedRow クラスを使用してインデックス付き行を持つ RDDFirst を作成し、次に IndexedRowMatrix を作成します。 ∞ CoordinateMatrix: 大規模で疎な行列を表すのに非常に便利です。 CoordinateMatrix は、MatrixEntry の RDD から作成され、型 (long、long、または float) のタプルによって表されます。 ∞ BlockMatrix: ((blockRowIndex, blockColIndex), サブマトリックス) 形式のサブマトリックス ブロックの RDD から作成されます。 機械学習ワークフローとデータフロー 機械学習ではアルゴリズムに加えて処理も必要であり、教師あり学習と教師なし学習の一般的なプロセスとデータフローについて説明します。 教師あり学習ワークフロー 教師あり学習では、入力トレーニング データ セットにラベルが付けられます。重要な方法は、入力をトレーニングとテスト、および対応するモデルに分割することです。教師あり学習を完了するには、次の 6 つの手順があります。 - データを収集する: このステップは、前の章に基づいており、機械学習アルゴリズムが信頼できる回答を提供できるように、データの量と粒度が適切であることを確認します。
- データを前処理します。サンプリングによってデータの品質を確認し、欠落しているデータ値を入力し、データをスケーリングして正規化します。同時に、特徴抽出プロセスが定義されます。通常、大規模なテキスト データセットでは、トークン化、ストップワードの削除、ステミング、TF-IDF が実行されます。教師あり学習では、データはそれぞれトレーニング セットとテスト セットに分割されます。また、クロス検証のためにデータセットを分割するためのさまざまなサンプリング戦略も実装しました。
- データを準備する: アルゴリズムに必要な形式とデータ型でデータを準備します。 Spark MLlib では、これらにはローカル ベクトル、密または疎なベクトル、ラベル付きポイント、ローカル マトリックス、行マトリックスを含む分散マトリックス、インデックス付き行マトリックス、座標マトリックス、ブロック マトリックスが含まれます。
- モデル: 問題に対してアルゴリズムを使用し、最も適したアルゴリズムの評価結果を取得します。同じ問題に適したアルゴリズムが複数存在する場合があります。その場合、最適なものを選択できるように、それらのパフォーマンスが評価ステップに保存されます。 最良の結果を得るために、包括的なソリューションまたはモデルの組み合わせを実装できます。最適化: 一部のアルゴリズムのパラメータの最適化では、グリッド検索を実行する必要があります。これら 9 つのパラメーターは、トレーニング、テスト、製品調整の段階によって異なります。
- 評価: 最後に、モデルにスコアが付けられ、精度、パフォーマンス、信頼性、スケーラビリティに基づいて最適なモデルが選択されます。 最もパフォーマンスの高いモデルを使用してデータをテストし、モデルの予測の精度を確認します。調整されたモデルに満足したら、実際のデータを使用して本番環境に移行できます。
教師あり機械学習のワークフローとデータフローを次の図に示します。 教師なし学習ワークフロー 教師あり学習とは対照的に、教師なし学習の初期データはラベル付けされておらず、これが現実の状況です。データ内の構造は、クラスタリングまたは次元削減アルゴリズムによって抽出されます。教師なし学習では、データにラベルが付いておらず予測ができないため、データをトレーニングとテストに分割する必要はありません。データをトレーニングするための 6 つのステップは、教師あり学習のステップと似ています。モデルがトレーニングされると、結果が評価され、モデルは本番環境にリリースされる前に調整されます。 教師なし学習は教師あり学習の最初のステップです。 つまり、データ次元の削減は学習段階に先行します。 教師なし機械学習のワークフローとデータフローは次のように表現されます。 Twitter データセットのクラスタリング Twitter から抽出されたデータを理解し、データ構造を理解してから、K-Means クラスタリング アルゴリズムを実行します。教師なし処理とデータ フローを使用した手順は次のとおりです。 1. すべてのツイート ファイルをデータフレームに結合します。 2. ツイートを解析し、ストップワードを削除し、絵文字を抽出し、URL を抽出し、最後に単語を正規化します (例: 小文字に変換、句読点と数字を削除)。 3. 特徴抽出には次の手順が含まれます。 ∞ トークン化: ツイートのテキストを個々の単語またはトークンに解析します ∞ TF-IDF: TF-IDFアルゴリズムを適用してテキストトークンから特徴ベクトルを作成する ∞ハッシュTF-IDF:ハッシュ関数を適用したTF-IDF 4. K-Means クラスタリング アルゴリズムを実行します。 5. K-Meansクラスタリングの結果を評価する: ∞ ツイートのメンバーシップとクラスタリング結果の定義 ∞ 多次元尺度法とPCAアルゴリズムを使用して2次元への次元削減分析を実行する ∞ プロットクラスター 6. 組立ライン: ∞ 関連クラスタリングのK値の数を調整する ∞ モデルコストの測定 ∞ 最適化されたモデルを選択する Twitter データセットに Scikit-Learn を適用する Python には独自の Scikit-Learn 機械学習ライブラリがあり、これは最も信頼性が高く、直感的で堅牢なツールの 1 つです。 Pandas と Scikit-Learn を使用して前処理と教師なし学習を実行します。 Spark MLlib を使用してクラスタリングを実行する前に、Scikit-Learn を使用してデータのサンプルを調べると役立ちます。ここに 7,540 件のツイートがミックスされています。Apache Spark、Python、次期大統領選挙 (ヒラリー クリントンとドナルド)、ファッション関連のツイート、レディー ガガとジャスティン ビーバーの音楽に関するツイートが含まれています。Twitter データセットで Scikit-Learn を使用し、K-Means クラスタリング アルゴリズムを実行しました。 まず、サンプル データを Pandas データフレームに読み込みます。 - pandasをpdとしてインポートする
- csv_in = 'C:\\Users\\Amit\\Documents\\IPython Notebooks\\AN00_Data\\ unq_tweetstxt.csv'
- twts_df01 = pd.read_csv(csv_in、sep = ';' 、エンコーディング = 'utf-8' )
- [24]では:
- csv(csv_in, sep = ';' , エンコーディング = 'utf-8' )
- [24]では:
- twts_df01.count ()関数
- アウト[24]:
- 無名: 0 7540
- id 7540
- 作成日時 7540
- ユーザーID 7540
- ユーザー名 7538
- ツイートテキスト 7540
- データ型: int64
-
- #
- # ツイートのテキストを分析する
- #
- [82]では:
-
- twtstxt_ls01[6910:6920]
- アウト[82]:
- [ 'RT @deroach_Ismoke: 私は #hilaryclinton に投票しません http://t.co/jaZZpcHkkJ' 、
- 「RT @AnimalRightsJen: #HilaryClinton バーニー・サンダースとドナルド・トランプの共通点は何ですか?: 彼はこれまでのところ、… http://t.co/t2YRcGCh6…」 、
- 「ビルが他の女とヤっていた理由は分かるよ……つまり
- 彼がどんな人と結婚しているか見てください.....\n@HilaryClinton'、
- 「#ヒラリー・クリントン バーニー・サンダースとドナルド・トランプの共通点は何でしょうか?: これまでのところ、彼は… http://t.co/t2YRcGCh67 #Tcot #UniteBlue」 ]
まず、ツイートのテキストから特徴を抽出し、10,000 個の特徴と英語のストップワードを含む TF-IDF ベクター化ツールを使ってデータセットをベクトル化します。 - [37]では:
-
- print( "スパースベクトル化を使用してトレーニングデータセットから特徴を抽出します" )
- t0 =時間()
- スパースデータを使用してトレーニングデータセットから特徴を抽出する
- ベクトライザー
- [38]では:
-
- ベクターライザー = TfidfVectorizer(max_df=0.5, max_features=10000,
- min_df=2、stop_words= 'english' 、use_idf= True )
- X = ベクターライザー.fit_transform(twtstxt_ls01)
- #
- #出力 TFIDF特徴ベクトル化器
- #
- print( "%fs で完了しました" % ( time () - t0))
- print( "n_samples: %d, n_features: %d" % X.shape)
- 印刷()
- 5.232165秒で完了
- n_サンプル: 7540、n_特徴: 6638
データセットは 6638 個の特徴を持つ 7540 個のサンプルに分割され、K-Means クラスタリング アルゴリズムのスパース マトリックスを形成します。初期選択は 7 個のクラスターで、反復は最大 100 回です。 - [47]では:
-
- km = KMeans(n_clusters=7, init= 'k-means++' , max_iter=100, n_init=1,
- 詳細=1)
-
- print( "%s によるスパースデータのクラスタリング" % km)
- t0 =時間()
- km.fit(X)
- print( "%0.3fs で完了しました" % ( time () - t0))
-
- KMeans(copy_x= True 、init= 'k-means++' 、max_iter=100、n_clusters=7、n_init=1、によるスパースデータのクラスタリング
- n_jobs=1、事前計算距離= 'auto' 、ランダム状態=なし、
- 許容誤差=0.0001、詳細度=1)
- 初期化完了
- 反復 0、慣性 13635.141
- 反復1、慣性6943.485
- 反復2、慣性6924.093
- 反復3、慣性6915.004
- 反復4、慣性6909.212
- 反復5、慣性6903.848
- 反復6、慣性6888.606
- 反復7、慣性6863.226
- 反復8、慣性6860.026
- 反復9、慣性6859.338
- 反復10、慣性6859.213
- 反復11、慣性6859.102
- 反復12、慣性6859.080
- 反復13、慣性6859.060
- 反復14、慣性6859.047
- 反復15、慣性6859.039
- 反復16、慣性6859.032
- 反復17、慣性6859.031
- 反復18、慣性6859.029
- 反復18で収束
- 1.701秒で完了
18 回の反復後、K-Means クラスタリング アルゴリズムは収束しました。対応するキーワードに基づく 7 つのクラスターの結果を見てみましょう。クラスター 0 と 6 は、ジャスティン ビーバーとレディー ガガに関連する、音楽とファッションに関するツイートです。 クラスター 1 と 5 は、ドナルド トランプとヒラリー クリントンの米国大統領選挙に関連するツイートです。クラスター 2 と 3 は、私たちが関心を持っている Apache Spark と Python です。クラスター 4 には、タイに関連するツイートが含まれています。 - #
- #クラスターごとに上位の用語を調査する
- #
-
- [49]では:
-
- print( "クラスターごとの上位用語: " )
- order_centroids = km.cluster_centers_.argsort()[:, ::-1]
- 用語 = vectorizer.get_feature_names()
- iが範囲(7)内にある場合:
- print( "クラスター %d:" % i, end = '' )
- order_centroids[i, :20]内のindの場合:
- print( ' %s' % 用語[ind], end = '' )
- 印刷()
-
- クラスターごとの上位用語:
- クラスター 0: ジャスティンビーバー 愛 意味 RT フォロー ありがとう こんにちは https
- whatdoyoumean ビデオを聞きたい whatdoyoumeanviral rorykramer 幸せ lol 人を夢見させる justin
- クラスター 1: donaldtrump hilaryclinton rt https trump2016
- realdonaldtrump トランプ gop amp justinbieber クリントン大統領 メール oy8ltkstze tcot好きバーニーサンダース ヒラリー 人々 メール
- クラスター 2: ビッグデータ、Apache、Spark、Hadoop、分析、RT、Spark、トレーニング、チェンナイ、IBM、データサイエンス、Apache、処理、Cloudera、MapReduce、データ、SAP、https、Vora、変換、開発
- クラスター 3: apachespark python https rt spark data amp databricks using new learn hadoop ibm big apache continuumio bluemix learning join 開ける
- クラスター 4: ernestsgantt simbata3 jdhm2015 elsahel12 phuketdailynews dreamintentions beyhiveinfrance almtorta18 civipartnership 9_a_6
- 25whu72ep0 k7erhvu7wn fdmxxxcm3h osxuh2fxnt 5o5rmb0xhp jnbgkqn0dj ovap57ujdh dtzsz3lb6x サニーサイ12345 sdcvulih6g
- クラスター 5: トランプ ドナルド ドナルドトランプ スターバックス トランプ引用
- trumpforpresident oy8ltkstze https zfns7pxysx silly goy stump trump2016 ニュース jeremy coffee corbyn ok7vc8aetz rt tonight
- クラスター 6: ladygaga gaga lady rt https love follow horror cd story ahshotel american japan hotel human trafficking music fashion diet queen ahs
グラフを描いて結果を視覚化します。 6638 個の特徴の 7540 個のサンプルがあるため、多次元で視覚化することは困難です。そこで、MDS アルゴリズムを使用して次元を削減します。 - matplotlib.pyplot をpltとしてインポートします。
- matplotlib をmplとしてインポートする
- sklearn.manifoldからMDS をインポートします
-
- MDS()
-
- #
- #クラスターをプロットするため、 MDSを2次元(コンポーネント)に縮小します。
- #
- mds = MDS(n_components=2、非類似度= "事前計算済み" 、random_state=1)
-
- pos = mds.fit_transform(dist) # 形状 (n_components, n_samples)
-
- xs, ys = pos[:, 0], pos[:, 1]
-
- [67]では:
-
- #
- #辞書を使用してクラスターごとに色を設定する
- #
- cluster_colors = {0: '#1b9e77' 、1: '#d95f02' 、2: '#7570b3' 、3: '#e7298a' 、4: '#66a61e' 、5: '#9990b3' 、6: '#e8888a' }
-
- #
- #辞書を使用してクラスター名を設定する
- #
- cluster_names = {0: '音楽、ポップ' ,
- 1: 「米国政治、選挙」 、
- 2: 「ビッグデータ、スパーク」 、
- 3: 「スパーク、パイソン」 、
- 4: 「タイ」 、
- 5: 「米国政治、選挙」 、
- 6: 「ミュージック、ポップ」
- [115]では:
- #
- # matplotlib プロットをインラインで表示するipythonマジック
- #
- %matplotlib インライン
-
- #
- # MDS結果、クラスター番号、および
- 表示されるツイートのテキスト
- #
- df = pd.DataFrame(dict(x=xs, y=ys, ラベル=クラスター, txt=twtstxt_ls02_
- utf8)
- ix_start = 2000
- ix_stop = 2050
- df01 = df[ix_start:ix_stop]
-
- print(df01[[ 'ラベル' , 'txt' ]])
- 印刷(len(df01))
- 印刷()
-
- #グループ クラスター別
-
- グループ = df.groupby( 'ラベル' )
- groups01 = df01.groupby( 'ラベル' )
-
- #プロットを設定する
-
- 図、ax = plt.subplots(図サイズ=(17, 10))
- 軸マージン(0.05)
-
- #
- # プロットオブジェクトを構築する
- #
- のために 名前、グループ グループ01:
- ax.plot(グループ.x、グループ.y、 マーカー= 'o' 、 線種= '' 、 ms=12、
- label=cluster_names[名前]、color=cluster_colors[名前]、
- mec = 'なし' )
- ax.set_aspect( '自動' )
- ax.tick_params(\
- axis= 'x' 、# x軸の設定
- which = '両方' 、#
- 下 = 'オフ' 、#
- 上= 'オフ' 、#
- ラベルボトム = 'オフ' )
- ax.tick_params(\
- axis= 'y' 、# y軸の設定
- which = '両方' 、#
- 左= 'オフ' 、#
- 上= 'オフ' 、#
- labelleft = 'オフ' )
-
- ax.legend(ポイント数=1) #
- #
- #ツイートテキストのx,y位置にラベルを追加する
- #
- i が範囲内(ix_start、ix_stop)の場合:
- ax.text(df01.ix[i][ 'x' ], df01.ix[i][ 'y' ], df01.ix[i][ 'txt' ],
- サイズ= 10)
-
- plt.show() # プロットを表示する
-
-
- ラベルテキスト
- 2000 2 b 'RT @BigDataTechCon: '
- 2001 3 b 「@4Quant のプレゼンテーション」
- 2002 2 b 「カサンドラサミット201」
以下は、ビッグデータと Spark を表す青い点で表されたクラスター 2 と、Spark と Python を表す赤い点で表されたクラスター 3 のグラフと、関連するツイートのサンプルです。 Scikit-Learn を使用してデータに関する優れた洞察をいくつか調べたので、Twitter データセットで Spark MLlib を実行することに集中できます。 データセットの前処理 データセットに対してクラスタリング アルゴリズムを実行する準備をするために、ここでは特徴抽出とエンジニアリングに焦点を当てます。 Spark コンテキストをインスタンス化し、Twitter データセットを Spark データフレームに読み込みます。次に、ツイートのテキスト データをトークン化し、トークンにハッシュ頻度アルゴリズムを適用し、最後に逆ドキュメント頻度アルゴリズムを適用してデータを再スケールします。コードは次のとおりです。 - [3]では:
- #
- # Panda DFでcsvを読み込む
- #
- #
- pandasをpdとしてインポートする
- csv_in = '/home/an/spark/spark-1.5.0-bin-hadoop2.6/examples/AN_Spark/data/unq_tweetstxt.csv'
- pddf_in = pd.read_csv(csv_in、index_col=なし、header=0、sep= ';' 、encoding= 'utf-8' )
-
- [4]では:
-
- sqlContext = SQLContext(sc)
-
- [5]では:
-
- #
- # Panda DF をSpark DFに変換する
- #
-
- spdf_02 = sqlContext.createDataFrame(pdf_in[[ 'id' , 'user_id' , 'user_name' , 'tweet_text' ]])
-
- [8]では:
-
- spdf_02.表示()
-
- [7]では:
- spdf_02.テイク(3)
-
- アウト[7]:
-
- [Row(id=638830426971181057, user_id=3276255125, user_name=u '真の平等' , tweet_text=u 'ernestsgantt: BeyHiveInFrance: 9_A_6:dreamintentions: elsahel12: simbata3: JDHM2015: almtorta18:dreamintentions:\u2026 http://t.co/VpD7FoqMr0' ),
- 行(id=638830426727911424、user_id=3276255125、user_name=u' True
- 平等', tweet_text=u' ernestsgantt: BeyHiveInFrance:
- PhuketDailyNews: dreamintentions: elsahel12: simbata3: JDHM2015:almtorta18: CiviPa\u2026 http://t.co/VpD7FoqMr0'),
- 行(id=638830425402556417、user_id=3276255125、user_name=u' True
- 平等', tweet_text=u' ernestsgantt: BeyHiveInFrance: 9_A_6:
- ernestsgantt: elsahel12: simbata3: JDHM2015: almtorta18:
- CiviPartnership: dr_u2026 http://t.co/EMDOn8chPK')]
-
- [9]では:
-
- pyspark.ml.featureからHashingTF、IDF、Tokenizer をインポートします
-
- [10]では:
-
- #
- # tweet_textをトークン化する
- #
- tokenizer = Tokenizer(inputCol= "tweet_text" 、outputCol= "tokens" )
- トークンデータ = tokenizer.transform(spdf_02)
-
- [11]では:
-
- トークンデータ.take(1)
-
- アウト[11]:
-
- [Row(id=638830426971181057, user_id=3276255125, user_name=u '真の平等' , tweet_text=u 'ernestsgantt: BeyHiveInFrance:9_A_6: dreamintentions: elsahel12: simbata3: JDHM2015:almtorta18: dreamintentions:\u2026 http://t.co/VpD7FoqMr0' ,
- トークン=[u 'ernestsgantt:' , u 'beyhiveinfrance:' , u '9_a_6:' ,
- u 'dreamintentions:' 、 u 'elsahel12:' 、 u 'simbata3:' 、 u 'jdhm2015:' 、u 'almtorta18:' 、 u 'dreamintentions:\u2026' 、 u 'http://t.co/vpd7foqmr0' ])]
-
- [14]では:
- #
- #トークンにハッシュTFを適用する
- #
- hashingTF = HashingTF(入力列 = "トークン" 、出力列 = "rawFeatures" 、numFeatures = 2000)
- 機能データ = hashingTF.transform(トークンデータ)
-
- [15]では:
-
- 機能データ.take(1)
-
- アウト[15]:
-
- [Row(id=638830426971181057, user_id=3276255125, user_name=u '真の平等' , tweet_text=u 'ernestsgantt: BeyHiveInFrance:9_A_6: dreamintentions: elsahel12: simbata3: JDHM2015:almtorta18: dreamintentions:\u2026 http://t.co/VpD7FoqMr0' ,
- トークン=[u 'ernestsgantt:' , u 'beyhiveinfrance:' , u '9_a_6:' ,
- u 'dreamintentions:' 、 u 'elsahel12:' 、 u 'simbata3:' 、 u 'jdhm2015:' 、u 'almtorta18:' 、 u 'dreamintentions:\u2026' 、 u 'http://t.co/vpd7foqmr0' ],
- rawFeatures = SparseVector(2000, {74: 1.0, 97: 1.0, 100: 1.0, 160: 1.0,185: 1.0, 742: 1.0, 856: 1.0, 991: 1.0, 1383: 1.0, 1620: 1.0}))]
-
- [16]では:
-
- #
- # IDFを生の特徴に適用し、データを再スケールする
- #
- idf = IDF(inputCol= "rawFeatures" 、outputCol= "features" )
- idfモデル = idf.fit(特徴データ)
- 再スケールされたデータ = idfModel.transform(featuresData)
-
- rescaledData内の特徴について。select ( "features" ) .take (3):
- 印刷(機能)
-
- [17]では:
-
- 再スケールされたデータ.take(2)
-
- アウト[17]:
-
- [Row(id=638830426971181057, user_id=3276255125, user_name=u '真の平等' , tweet_text=u 'ernestsgantt: BeyHiveInFrance:9_A_6: dreamintentions: elsahel12: simbata3: JDHM2015:almtorta18: dreamintentions:\u2026 http://t.co/VpD7FoqMr0' ,
- トークン=[u 'ernestsgantt:' , u 'beyhiveinfrance:' , u '9_a_6:' ,
- u 'dreamintentions:' 、 u 'elsahel12:' 、 u 'simbata3:' 、 u 'jdhm2015:' 、u 'almtorta18:' 、 u 'dreamintentions:\u2026' 、 u 'http://t.co/vpd7foqmr0' ],
- rawFeatures = SparseVector(2000, {74: 1.0, 97: 1.0, 100: 1.0, 160: 1.0, 185: 1.0, 742: 1.0, 856: 1.0, 991: 1.0, 1383: 1.0, 1620: 1.0}),
- 特徴 = SparseVector(2000, {74: 2.6762, 97: 1.8625, 100: 2.6384, 160:2.9985, 185: 2.7481, 742: 5.5269, 856: 4.1406, 991: 2.9518, 1383:4.694, 1620: 3.073})),
- 行(id=638830426727911424、user_id=3276255125、user_name=u' True
- 平等', tweet_text=u' ernestsgantt: BeyHiveInFrance:
- PhuketDailyNews: dreamintentions: elsahel12: simbata3:
- JDHM2015: almtorta18: CiviPa_u2026 http://t.co/VpD7FoqMr0',
- トークン=[u 'ernestsgantt:' , u 'beyhiveinfrance:' , u 'phuketdailynews:' ,u 'dreamintentions:' , u 'elsahel12:' , u 'simbata3:' , u 'jdhm2015:' ,u 'almtorta18:' , u 'civipa\u2026' , u 'http://t.co/vpd7foqmr0' ],
- rawFeatures = SparseVector(2000, {74: 1.0, 97: 1.0, 100: 1.0, 160: 1.0, 185: 1.0, 460: 1.0, 987: 1.0, 991: 1.0, 1383: 1.0, 1620: 1.0}),
- 特徴 = SparseVector(2000, {74: 2.6762, 97: 1.8625, 100: 2.6384,160: 2.9985, 185: 2.7481, 460: 6.4432, 987: 2.9959, 991: 2.9518, 1383:4.694, 1620: 3.073}))]
-
- [21]では:
-
- rs_pddf = 再スケールされたData.toPandas()
-
- [22]では:
-
- rs_pdf.count ()関数
-
- アウト[22]:
-
- id 7540
- ユーザーID 7540
- ユーザー名 7540
- ツイートテキスト 7540
- トークン 7540
- 生の特徴 7540
- 機能 7540
- データ型: int64
-
-
- [27]では:
-
- feat_lst = rs_pdf.features.tolist() 関数
-
- [28]では:
- feat_lst[:2]
-
- アウト[28]:
-
- [SparseVector(2000, {74: 2.6762, 97: 1.8625, 100: 2.6384, 160: 2.9985,185: 2.7481, 742: 5.5269, 856: 4.1406, 991: 2.9518, 1383: 4.694, 1620:
- 3.073})、
- スパースベクトル(2000, {74: 2.6762, 97: 1.8625, 100: 2.6384, 160: 2.9985,185: 2.7481, 460: 6.4432, 987: 2.9959, 991: 2.9518, 1383: 4.694, 1620:3.073})]
クラスタリングアルゴリズムを実行する Twitter データセットに対してラベルなしツイートとして K-Means アルゴリズムを実行し、Apache Spark ツイートがクラスターを形成するかどうかを確認します。 前の手順に従って、TF-IDF の特徴のスパース ベクトルが RDD に変換され、Spark MLlib プログラムに入力されます。 K-Means モデルを 5 つのクラスターと 10 回の反復で初期化します。 - [32]では:
-
- pyspark.mllib.clusteringからKMeans、KMeansModel をインポートします
- numpyから配列をインポート
- 数学からインポートsqrt
-
- [34]では:
-
- #負荷 データを解析する
-
-
- in_Data = sc.parallelize(feat_lst)
-
- [35]では:
-
- in_Data.take(3)
-
- アウト[35]:
-
- [SparseVector(2000, {74: 2.6762, 97: 1.8625, 100: 2.6384, 160: 2.9985,185: 2.7481, 742: 5.5269, 856: 4.1406, 991: 2.9518, 1383: 4.694, 1620:3.073}),
- スパースベクトル(2000, {74: 2.6762, 97: 1.8625, 100: 2.6384, 160: 2.9985,185: 2.7481, 460: 6.4432, 987: 2.9959, 991: 2.9518, 1383: 4.694, 1620:3.073}),
- スパースベクトル(2000, {20: 4.3534, 74: 2.6762, 97: 1.8625, 100: 5.2768,185: 2.7481, 856: 4.1406, 991: 2.9518, 1039: 3.073, 1620: 3.073, 1864:4.6377})]
-
- [37]では:
-
- in_Data.count ()関数
-
- アウト[37]:
-
- 7540
-
- [38]では:
-
- # モデルを構築する(データをクラスタ化する)
-
- clusters = kmeans.train(in_data、5、maxiterations = 10、
- runs = 10、initializationMode = "ランダム" )
-
- [53] :
-
- #セット内で計算してクラスタリングを評価します 和 四角いエラーの
-
- defエラー(ポイント):
- center = clusters.centers [clusters.predict(point)]]
- return sqrt( sum ([x ** 2 for x in (point -center)])))
-
- wssse = in_data.map(lambda point:error(point))。reduce(lambda x、y:x + y)
- print( "set sum of Squared error =" + str(wssse))内
モデルと結果の評価 クラスタリングアルゴリズムをチューニングする1つの方法は、クラスターの数を変更し、これらのクラスターを確認して、現在のクラスタリング結果の感触を取得することです。 - [43] :
-
- cluster_membership = in_data.map(lambda x:clusters.predict(x))
-
- [54] :
- cluster_idx = cluster_membership.zipwithindex()
-
- [55] :
-
- タイプ(cluster_idx)
-
- Out [55]:
-
- pyspark.rdd.pipelinedrdd
-
- [58] :
-
- cluster_idx.take(20)
-
- Out [58]:
-
- [(3、0)、
- (3、1)、
- (3、2)、
- (3、3)、
- (3、4)、
- (3、5)、
- (1、6)、
- (3、7)、
- (3、8)、
- (3、9)、
- (3、10)、
- (3、11)、
- (3、12)、
- (3、13)、
- (3、14)、
- (1、15)、
- (3、16)、
- (3、17)、
- (1、18)、
- (1、19)]
-
- [59] :
-
- cluster_df = cluster_idx.todf()
-
- [65] :
- pddf_with_cluster = pd.concat([pddf_in、cluster_pddf]、axis = 1)
-
- [76] :
-
- pddf_with_cluster._1.unique ()
-
- Out [76]:
-
- 配列([3、1、4、0、2])
-
- [79] :
-
- pddf_with_cluster [pddf_with_cluster [ '_1' ] == 0] .head(10)
-
- Out [79]:
- 無名:0 id created_at user_id user_name tweet_text _1 _2
- 6227 3 642418116819988480 FRI SEP 11 19:23:09 +0000 2015
- 49693598 ajinkya kale rt @bigdata:分散マトリックス計算
- I ... 0 6227
- 6257 45 642391207205859328 FRI SEP 11 17:36:13 +0000 2015
- 937467860 Angela Bassa [auto]私は読んでいます""分散マトリックス
- コンピューター... 0 6257
- 6297 119 642348577147064320 FRI SEP 11 14:46:49 +0000
- 2015 18318677 ben lorica分散マトリックス計算@
- Apachespar ... 0 6297
- [80]で:
-
- pddf_with_cluster [pddf_with_cluster [ '_1' ] == 1] .head(10)
-
- out [80]:
- 無名:0 id created_at user_id user_name tweet_text _1
- _2
- 6 6 638830419090079746 TUE SEP 01 21:46:55 +0000 2015
- 2241040634 Massimo carrisi python:python:\ xa0を削除します
- 文字列?
- 15 17 638830380578045953 TUE SEP 01 21:46:46 +0000 2015
- 57699376 Rafael Monnerat RT @ramalhoorg:表示する写真はありません
- 流fluent ... 115
- 18 41 638830280988426250 TUE SEP 01 21:46:22 +0000 2015
- 951081582 Jack Baldwin RT @cloudaus :私たちは3/4です!
- swcarpen ... 1 18
- 19 42 638830276626399232 TUE SEP 01 21:46:21 +0000 2015
- 6525302正面林pynamodb #aws #dynamodb #python
- http:// ... 1 19
- 20 43 638830213288235008 TUE SEP 01 21:46:06 +0000 2015
- 3153874869 Baltimore Python Flexx:Python UiはWebに基づいて削除されました
- テクノロジー... 1 20
- 21 44 638830117645516800 TUE SEP 01 21:45:43 +0000 2015
- 48474625ラジオフリーデナリうーん、emerge
- Somethi ... 1 21
- 22 46 638829977014636544 TUE SEP 01 21:45:10 +0000 2015
- 154915461 Luciano Ramalho Noite deautógrafosは流fluentPython no no no
- ガロア... 122
- 23 47 638829882928070656 TUE SEP 01 21:44:47 +0000 2015
- 917320920 bsbafflesbrains @danswright Harperチャネリングモンティ
- Python
- 24 48 638829868679954432 TUE SEP 01 21:44:44 +0000 2015
- 134280898 Lannick Technology RT @sergeykalnish:私は#hiring:
- シニアバックE ... 1 24
- 25 49 638829707484508161 TUE SEP 01 21:44:05 +0000 2015
- 2839203454 Joshua Jones RT @lindseypelas:生き残ったMonty Python
- FL ... 1 25
- [81] :
-
- pddf_with_cluster [pddf_with_cluster [ '_1' ] == 2] .head(10)
-
- Out [81]:
- 無名:0 id created_at user_id user_name tweet_text _1
- _2
- 7280 688 639056941592014848水曜日02 12:47:02 +0000 2015
- 2735137484 chris本当のゲイのアイコン@ladygaga @madonna @...
- 2 7280
- [82]で:
-
- pddf_with_cluster [pddf_with_cluster [ '_1' ] == 3] .head(10)
-
- Out [82]:
- 無名:0 id created_at user_id user_name tweet_text _1
- _2
- 0 0 638830426971181057 TUE SEP 01 21:46:57 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:9_a_6:
- Dreamint ... 3 0
- 1 1 638830426727911424 TUE SEP 01 21:46:57 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:
- phuketdailynews ... 3 1
- 2 2 638830425402556417 TUE SEP 01 21:46:56 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:9_a_6:
- ernestsg ... 3 2
- 3 3 638830424563716097 TUE SEP 01 21:46:56 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:
- phuketdailynews ... 3 3
- 4 4 6388304422256816132 TUE SEP 01 21:46:56 +0000 2015
- 3276255125真の平等アーネストガント:elsahel12:9_a_6:
- 夢の意図... 3 4
- 5 5 6388304220159655936 TUE SEP 01 21:46:55 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:
- phuketdailynews ... 3 5
- 7 7 638830418330980352 TUE SEP 01 21:46:55 +0000 2015
- 3276255125真の平等アーネストガント:elsahel12:9_a_6:
- 夢の意図... 3 7
- 8 8 638830397648822272 TUE SEP 01 21:46:50 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:
- phuketdailynews ... 3 8
- 9 9 638830395375529984 TUE SEP 01 21:46:49 +0000 2015
- 3276255125真の平等アーネストガント:elsahel12:9_a_6:
- 夢の意図... 3 9
- 10 10 638830392389177344 TUE SEP 01 21:46:49 +0000 2015
- 3276255125真の平等アーネストガント:beyhiveinfrance:
- phuketdailynews ... 3 10
- [83] :
-
- pddf_with_cluster [pddf_with_cluster [ '_1' ] == 4] .head(10)
-
- Out [83]:
- 無名:0 id created_at user_id user_name tweet_text _1
- _2
- 1361 882 642648214454317056 SAT SEP 12 10:37:28 +0000 2015
- 27415756 Raymond Enisuoh La La choosen for US 2024オリンピック入札 -
- LA2016参照... 4 1361
- 1363 885 64264784874583168 SAT SEP 12 10:36:01 +0000 2015
- 27415756 Raymond Enisuoh刑務所参照:https://t.co/x3ekaexefi……
- ……41363
- 5412 11 640480770369286144 SUN SEP 06 11:04:49 +0000 2015
- 3242403023ドナルドトランプ2016 "igiboooy! @ starbucks https:// t。
- CO/97WDL ... 4 5412
- 5428 27 640477140660518912 SUN SEP 06 10:50:24 +0000 2015
- 3242403023 Donald Trump 2016 " @ Starbucks https://t.co/
- WSEYFIEFK7 "-D ... 4 5428
- 5455 61 640469542272110592 SUN SEP 06 10:20:12 +0000 2015
- 3242403023 Donald Trump 2016 "Starbucks @ starbucks mamplaza
- https://t.co ... 4 5455
- 5456 62 640469541370372096 SUN SEP 06 10:20:12 +0000 2015
- 3242403023ドナルドトランプ2016 "aaahhhカボチャスパイスラテは
- 戻って、秋... 4 5456
- 5457 63 640469539524898817 SUN SEP 06 10:20:12 +0000 2015
- 3242403023 Donald Trump 2016 "RT Kayyleighferry:Oh My Goddd
- ハリー・ポッター... 45457
- 5458 64 640469537176031232 SUN SEP 06 10:20:11 +0000 2015
- 3242403023 Donald Trump 2016 "Starbucks https://t.co/3xyyxlwnkf
- 「 - ドナルド... 4 5458
サンプルのツイートを5つのクラスターにマッピングします Pythonについて。クラスター2レディー・ガガについて。クラスター3タイのプーケットについて ニュース。ドナルド・トランプについてクラスター4。 機械学習パイプラインを構築します 最適なパラメーターを最適化して最適な実行モデルを取得する場合、機能抽出、準備活動、トレーニング、テスト、予測アクティビティを組み合わせることができることを願っています。 Spark Mllibで強力な機械学習パイプラインを実装し、5行のコードで次のツイートを正確にキャプチャします。 Spark ML Pipelinesは、PythonのScikit-Learnに触発され、データが簡潔かつ継続的な変換で調整可能なモデルをすばやく公開する宣言的なステートメントを作成しました。 Spark2.1.0の開始:Sparkのインストールと使用 それはヒーローですか、それともクマですか? Apache Spark Memory Management詳細な説明 Spark Performance Optimization Method — N Spark Data Tilt(Data Skew)を解くための姿勢 |