このガイドでは、まずアプローチを確認し、次にデータを段階的に分析することで各人のストロークを予測します。
ロジスティック回帰
ロジスティック回帰は「ロジット モデル」とも呼ばれ、分類問題の予測分析で使用されます。これは、クラス(カテゴリー)を分類する分類のみに機能する機械学習モデルです。たとえば、このシナリオには 2 つのカテゴリがあります (脳卒中を患っている人と脳卒中を患っていない人)。このモデルの最適な用途は、心臓病の予測、性別の予測、農作物の寿命予測などです。
手順:
1. データ収集: データは予測/分析を実行するために必要です。 CSV/XLSX などの形式にすることができます。これは、spark.read.csv() メソッドを使用して Spark 環境 (DataFrame) にロードできます。
2. データ分析 : 属性/列の分析は「データ分析」と呼ばれます。クラスの予測に役立つ列は、「独立属性」と呼ばれます。予測の結果となる列は、「依存属性またはターゲット属性」と呼ばれます。このシナリオでは、 columns プロパティを使用してすべての列を表示できます。 unique() メソッドは、一意の値を確認するために使用されます。
3. データの前処理: Null/欠損値をフィルタリングすることは、「前処理」として知られています。この段階で欠損値をすべて削除します。マシンはバイナリ言語しか認識しません。したがって、すべての文字列カテゴリを数値カテゴリ値に変換する必要があります。 PySpark では、pyspark.ml.feature モジュールで利用可能なクラスである「StringIndexer」を使用して、文字列カテゴリを数値に変換できます。内部で自動的に変換されます。値を指定する必要はありません。次の構文を使用できます。
Indexer_data=StringIndexer(inputCol= 「文字列カテゴリ列名」 ,outputCol= '新しい列名' )
4. ベクトルの組み立て: これで、マシンが理解できるデータが得られました。この段階では、すべての独立した属性を 1 つの列にベクトル化する必要があります。これは、VectorAssembler クラスを使用して実行できます。これには 2 つのパラメータが必要です。最初のパラメータは、独立した属性のリストを取る inputCols です。 2 番目のパラメーターは、すべての inputCols をこの変数にベクトル化する OutputCol です。
アセンブラー=VectorAssembler(inputCols=[列…],outputCol=vectorized_data)5. 変換: ここで、transform() 関数を使用して更新された列を変換し (ステップ 3)、データを準備します。
アセンブラー.transform(inxed_data)
6. トレーニングとテスト用のデータの準備: この段階では、データを「トレーニング」と「テスト」に分割します。 70% のデータをモデルのトレーニング用に、30% のデータをモデルのテスト用に分割すると良いでしょう。これは、randomSplit() メソッドを使用して実現できます。これは 2 つの float 値を保持するリストを受け取ります。1 つはテスト分割用、もう 1 つはトレイン分割用です。
train_data,test_data=final_data.select([ '特徴' ,target_column]).randomSplit([0.70.0.30])7. モデルのフィッティングと評価 : ロジスティック回帰モデルを当てはめる時期が来ました。ロジスティック回帰モデルは、pyspark.ml.classification モジュールで利用できます。クラスラベル/ターゲット列を受け取ります。これにより、rawPrediction、確率、および予測の列が生成されます。結果は予測列に保存されます。
# モデルフィッティングlogistic_regression_model=LogisticRegression(labelCol=target_column).fit(train_data)
# モデルの評価
train_results=logistic_regression_model.evaluate(train_data).predictions
8. 精度と結果: これは、テスト手法を使用してモデルの精度をテストする最終段階です。
ロジスティック回帰モデルを使用して、ある人が脳卒中の影響を受けているかどうかを予測する次のプロジェクトを見てみましょう。
脳卒中予測
9. PySpark モジュールを環境にインストールします。インストールするコマンドは次のとおりです。
pip インストール pyspark
10. 10 人の脳卒中詳細に関連する 10 個のレコードを含む PySpark DataFrame を作成しましょう。デモのために、CSV を使用せずに DataFrame を作成します。このデータフレームには 7 つの列があります。 「性別」、「血糖値」、「既婚」、「年齢」、「心臓疾患」、「高血圧」は独立属性であり、「脳卒中」はクラスラベルまたは依存属性です。つまり、人のストロークはこれらの独立した属性に依存しているということです。
pysparkをインポートするpyspark.sql から SparkSession をインポート
linuxhint_spark_app = SparkSession.builder.appName( 「Linux のヒント」 ).getOrCreate()
ストークデータ =[
{ '性別' : '女性' 、 '年' : 50 、 '心臓病' : 'はい' 、
「ハイパーテンション」 : 'はい' 、 '結婚' : 'はい' 、 'グルコースレベル' : 130 、 '脳卒中' : 1 }、
{ '性別' : '男' 、 '年' : 二十 、 '心臓病' : 'いいえ' 、
「ハイパーテンション」 : 'はい' 、 '結婚' : 'いいえ' 、 'グルコースレベル' : 97 、 '脳卒中' : 0 }、
{ '性別' : '男' 、 '年' : 12 、 '心臓病' : 'いいえ' 、
「ハイパーテンション」 : 'いいえ' 、 '結婚' : 'いいえ' 、 'グルコースレベル' : 98 、 '脳卒中' : 0 }、
{ '性別' : '女性' 、 '年' : 90 、 '心臓病' : 'いいえ' 、
「ハイパーテンション」 : 'いいえ' 、 '結婚' : 'はい' 、 'グルコースレベル' : 170 、 '脳卒中' : 1 }、
{ '性別' : '男' 、 '年' : 43 、 '心臓病' : 'はい' 、
「ハイパーテンション」 : 'はい' 、 '結婚' : 'はい' 、 'グルコースレベル' : 150 、 '脳卒中' : 1 }、
{ '性別' : '女性' 、 '年' : 21 、 '心臓病' : 'いいえ' 、
「ハイパーテンション」 : 'いいえ' 、 '結婚' : 'はい' 、 'グルコースレベル' : 110 、 '脳卒中' : 0 }、
{ '性別' : '女性' 、 '年' : 50 、 '心臓病' : 'はい' 、
「ハイパーテンション」 : 'いいえ' 、 '結婚' : 'はい' 、 'グルコースレベル' : 100 、 '脳卒中' : 0 }、
{ '性別' : '男' 、 '年' : 3.4 、 '心臓病' : 'いいえ' 、
「ハイパーテンション」 : 'はい' 、 '結婚' : 'はい' 、 'グルコースレベル' : 190 、 '脳卒中' : 1 }、
{ '性別' : '男' 、 '年' : 10 、 '心臓病' : 'いいえ' 、
「ハイパーテンション」 : 'いいえ' 、 '結婚' : 'いいえ' 、 'グルコースレベル' : 90 、 '脳卒中' : 0 }、
{ '性別' : '女性' 、 '年' : 56 、 '心臓病' : 'はい' 、
「ハイパーテンション」 : 'はい' 、 '結婚' : 'はい' 、 'グルコースレベル' : 145 、 '脳卒中' : 1 }
】
# 上記のデータからデータフレームを作成します
ストローク_df = linuxhint_spark_app.createDataFrame(stoke_data)
# 実際のストーク_df
ストローク_df.show()
出力:
11. select() メソッドを使用して独立列を表示します。
# 独立した属性を表示するストローク_df.select(ストローク_df[ '性別' ]、ストローク_df[ 「グルコースレベル」 ]、ストローク_df[ '結婚' ]、ストローク_df[ '年' ]、ストローク_df[ '心臓病' ]、ストローク_df[ 「ハイパーテンション」 ])。見せる()
出力:
12. ターゲット属性 (ストローク) に存在する一意の値を表示します。
# ターゲット属性の一意の値ストローク_df.select(ストローク_df[ '脳卒中' ]).distinct().show()
出力:
13. printSchema() 関数を使用して、すべての列のデータ型を返します。
# すべての列のデータ型を返します。ストローク_df.printSchema()
出力:
4 つの列が文字列型であることがわかります。これらをカテゴリカルな数値に変換してみましょう。
14. 「Gender」、「heart_disease」、「hyper_tension」、および「married」列の StringIndexer を使用して、文字列のカテゴリ値を数値のカテゴリ値に変換し、これらを Categotical_Gender、Categotical_heart_disease、Categotical_hyper_tension、および Categotical_married 列に書き込みましょう。 fit() メソッドを使用して列を Indexed_data データフレームに保存します。
pyspark.ml.feature インポート StringIndexer から# 「性別」列の文字列のカテゴリ値を数値のカテゴリ値に変換します。
Indexer_data=StringIndexer(inputCol= '性別' ,outputCol= 「カテゴリ別_性別」 )
Indexed_data=indexer_data.fit(ストローク_df).transform(ストローク_df)
# 「heart_disease」列の文字列のカテゴリ値を数値のカテゴリ値に変換します。
Indexer_data=StringIndexer(inputCol= '心臓病' ,outputCol= 「カテゴリー的心臓疾患」 )
Indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)
# 「hyper_tension」列の文字列のカテゴリ値を数値のカテゴリ値に変換します。
Indexer_data=StringIndexer(inputCol= 「ハイパーテンション」 ,outputCol= 「カテゴティカル・ハイパー・テンション」 )
Indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)
# 文字列のカテゴリ値を「既婚」列の数値のカテゴリ値に変換します。
Indexer_data=StringIndexer(inputCol= '結婚' ,outputCol= 「カテゴリー別_既婚」 )
Indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)
# 更新されたものを表示する
インデックスデータ.show()
出力:
15. ベクトル アセンブラを使用して、独立した列をベクトルに変換します。ベクトル名は「features」です。
pyspark.ml.feature から VectorAssembler をインポートアセンブラ= VectorAssembler(inputCols=[ 「カテゴリ別_性別」 、 「カテゴリー的心臓疾患」 、 「カテゴティカル・ハイパー・テンション」 、 「カテゴリー別_既婚」 、 '年' 、
'グルコースレベル' ],outputCol= '特徴' )
16.transform() 関数を使用して前のデータを最終的な DataFrame に変換し、show() 関数を使用して表示します。
出力:
17. トレーニングとテスト用のデータを 70 ~ 30 に分割して準備します。 「features」はtrain_dataに、「Stroke」はtest_dataに格納されます。
# トレーニングとテスト用のデータを準備するtrain_data,test_data=final.select([ '特徴' 、 '脳卒中' ]).randomSplit([ 0.70 、 0.30 ])
18. ロジスティック回帰モデルを当てはめて評価します。
pyspark.ml.classification からのインポート LogisticRegression# モデルフィッティング
logistic_regression_model=ロジスティック回帰(labelCol= '脳卒中' ).fit(train_data)
# モデルの評価
train_results=logistic_regression_model.evaluate(train_data).predictions
train_results.show()
出力:
19. BinaryClassificationEvaluator を使用してモデルの精度を確認します。モデルが 100% 正確であることがわかります。
pyspark.ml.evaluation からインポート BinaryClassificationEvaluator# BinaryClassificationEvaluator を呼び出す
results = BinaryClassificationEvaluator(rawPredictionCol= '予測' ,labelCol= '脳卒中' )
ROC_AUC = 結果.評価(train_results)
print(ROC_AUC * 100 、 '% 正確さ' )
結論
PySpark のロジスティック回帰モデルを使用して、実タイル分類問題を予測できます。 Null/欠損値を削除すると、モデルの評価と精度が低下するため、これらの値を削除することが重要です。前処理は、機械学習モデルを適合させる前に必要なステップです。この手順を適切かつ正確に実行してください。