MLlib 二分类问题
MLlib 二分類問題
【課程性質:PySpark機器學習】
文章目錄
- 1. 實驗目標
- 2. 本次實驗主要使用的 PythonPythonPython 庫
- 3. 適用的對象
- 4. 實驗步驟
- 步驟1 安裝并引入必要的庫
- 步驟2 探索數據
- 步驟3 查看前五個觀測樣本
- 3.1 pandas.DataFrame 比 Spark DataFrame.show()更漂亮
- 3.2 查看數據標簽
- 3.3 數值變量的匯總統計信息
- 3.4 變量的相關性檢驗
- 3.5 為機器學習準備數據
- 3.6 管道
- 步驟4 邏輯回歸
- 步驟5 決策樹分類器
- 步驟6 隨機森林分類器
- 步驟7 Gradient-boosted樹分類器
- 思考
1. 實驗目標
- 使用PySpark分析葡萄牙銀行機構的直接營銷活動(電話)有關數據
- 使用PySpark MLlib對數據進行預測
- 邏輯回歸
- 決策樹
- 隨機森林
2. 本次實驗主要使用的 PythonPythonPython 庫
| requestsrequestsrequests | 2.20.02.20.02.20.0 | 線性代數 |
| PandasPandasPandas | 0.25.00.25.00.25.0 | 數據分析 |
| PySparkPySparkPySpark | 2.4.32.4.32.4.3 | 大數據處理 |
| MatplotlibMatplotlibMatplotlib | 3.1.03.1.03.1.0 | 數據可視化 |
3. 適用的對象
- 本課程假設您已經學習了 PythonPythonPython 基礎,具備數據可視化基礎
- 學習對象:本科學生、研究生、人工智能、算法相關研究者、開發者
- 大數據分析與人工智能
4. 實驗步驟
步驟1 安裝并引入必要的庫
# 安裝第三方庫 !pip install pyspark==2.4.5 !pip install numpy==1.16.0 !pip install pandas==0.25.0 !pip install matplotlib==3.1.0 import numpy as np import pandas as pd from time import time from pyspark.ml.feature import (OneHotEncoderEstimator, StringIndexer,VectorAssembler) from pyspark.sql import SparkSession from pyspark.ml.classification import LogisticRegression from pyspark.ml import Pipeline from pyspark.ml.classification import DecisionTreeClassifier from pyspark.ml.classification import RandomForestClassifier from pyspark.ml.classification import GBTClassifier from pyspark.ml.tuning import ParamGridBuilder, CrossValidator%matplotlib inlineApache Spark 是 Hadoop 生態的一個組件,現在正成為企業首選的大數據平臺。
它是一個功能強大的開源引擎,提供實時流處理、交互處理、圖形處理、內存處理以及批處理,具有非常快的速度、易用性和標準接口。
在工業界中,對一個強大的引擎有著巨大的需求,這個引擎可以做到以上所有的事情。
遲早,您的公司或客戶將使用Spark開發復雜的模型,使您能夠發現新的機會或避免風險。
Spark 并不難學,如果您已經知道 Python 和 SQL,那么入門就非常容易。我們今天就試試吧!
步驟2 探索數據
數據集與葡萄牙銀行機構的直接營銷活動(電話)有關。分類目標是預測客戶是否會認購定期存款(是/否)。
spark = SparkSession.builder.appName('ml-bank').getOrCreate() df = spark.read.csv('bank.csv', header=True, inferSchema=True) df.printSchema()輸入變量:
- age, job, marital, education, default, balance, housing, loan, contact, day, month, duration, campaign, pdays, previous, poutcome.
輸出變量: - deposit
步驟3 查看前五個觀測樣本
3.1 pandas.DataFrame 比 Spark DataFrame.show()更漂亮
pd.DataFrame(df.take(5), columns=df.columns).transpose()3.2 查看數據標簽
df.groupby('deposit').count().toPandas()3.3 數值變量的匯總統計信息
numeric_features = [t[0] for t in df.dtypes if t[1] == 'int'] df.select(numeric_features).describe().toPandas().transpose()3.4 變量的相關性檢驗
numeric_data = df.select(numeric_features).toPandas()axs = pd.plotting.scatter_matrix(numeric_data, figsize=(8, 8));# 旋轉軸標簽并移除軸刻度 n = len(numeric_data.columns) for i in range(n):v = axs[i, 0]v.yaxis.label.set_rotation(0)v.yaxis.label.set_ha('right')v.set_yticks(())h = axs[n-1, i]h.xaxis.label.set_rotation(90)h.set_xticks(())很明顯,沒有高度相關的自變量。因此,我們將保留所有的變量。然而,日列和月列并不是很有用,我們將刪除這兩列。
df = df.select('age', 'job', 'marital', 'education', 'default', 'balance','housing', 'loan', 'contact', 'duration', 'campaign', 'pdays','previous', 'poutcome', 'deposit') cols = df.columns df.printSchema()3.5 為機器學習準備數據
分類索引,一個One-Hot和向量匯編器,一個特征轉換器,合并多個列成一個向量列。
categoricalColumns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact','poutcome' ] stages = []for categoricalCol in categoricalColumns:stringIndexer = StringIndexer(inputCol=categoricalCol,outputCol=categoricalCol + 'Index')encoder = OneHotEncoderEstimator(inputCols=[stringIndexer.getOutputCol()],outputCols=[categoricalCol + "classVec"])stages += [stringIndexer, encoder]label_stringIdx = StringIndexer(inputCol='deposit', outputCol='label') stages += [label_stringIdx]numericCols = ['age', 'balance', 'duration', 'campaign', 'pdays', 'previous'] assemblerInputs = [c + "classVec" for c in categoricalColumns] + numericCols assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features") stages += [assembler]上面的代碼取自 databricks 的官方站點,它使用 StringIndexer 對每個分類列進行索引,然后將索引的類別轉換為一個one-hot變量。
得到的輸出將二進制向量附加到每一行的末尾。
我們再次使用 StringIndexer 將標簽編碼為標簽索引。
接下來,我們使用 VectorAssembler 將所有特性列組合成一個向量列。
3.6 管道
我們使用管道將多個轉換器和評估器鏈接在一起,以指定我們的機器學習工作流。管道的階段被指定為有序數組。
pipeline = Pipeline(stages=stages) pipelineModel = pipeline.fit(df) df = pipelineModel.transform(df) selectedCols = ['label', 'features'] + cols df = df.select(selectedCols) df.printSchema() pd.DataFrame(df.take(5), columns=df.columns).transpose()將數據隨機分成訓練集和測試集。設置隨機種子的保證實驗重復性一致。
train, test = df.randomSplit([0.7, 0.3], seed = 2018) print("Training Dataset Count: " + str(train.count())) print("Test Dataset Count: " + str(test.count()))步驟4 邏輯回歸
lr = LogisticRegression(featuresCol='features', labelCol='label', maxIter=10) lrModel = lr.fit(train)我們可以利用邏輯回歸模型的屬性得到回歸系數與回歸參數。
import matplotlib.pyplot as plt import numpy as npbeta = np.sort(lrModel.coefficients)plt.plot(beta) plt.ylabel('Beta Coefficients') plt.show() trainingSummary = lrModel.summaryroc = trainingSummary.roc.toPandas() plt.plot(roc['FPR'],roc['TPR']) plt.ylabel('False Positive Rate') plt.xlabel('True Positive Rate') plt.title('ROC Curve') plt.show()print('Training set areaUnderROC: ' + str(trainingSummary.areaUnderROC))精度和召回 Precision and Recall
pr = trainingSummary.pr.toPandas() plt.plot(pr['recall'],pr['precision']) plt.ylabel('Precision') plt.xlabel('Recall') plt.show()設置模型閾值,使F-Measure最大化
f = trainingSummary.fMeasureByThreshold.toPandas() plt.plot(f['threshold'],f['F-Measure']) plt.ylabel('F-Measure') plt.xlabel('Threshold') plt.show()對測試集進行預測
predictions = lrModel.transform(test) predictions.select('age', 'job', 'label', 'rawPrediction', 'prediction', 'probability').show(10)評估我們的邏輯回歸模型
from pyspark.ml.evaluation import BinaryClassificationEvaluatorevaluator = BinaryClassificationEvaluator() print('Test Area Under ROC', evaluator.evaluate(predictions)) evaluator.getMetricName()模型訓練的很好。
嘗試使用ParamGridBuilder和CrossValidator對模型進行調優。
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator# Create ParamGrid for Cross Validation paramGrid = (ParamGridBuilder().addGrid(lr.regParam, [0.01, 0.5, 2.0]).addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0]).addGrid(lr.maxIter, [1, 5, 10]).build())cv = CrossValidator(estimator=lr, estimatorParamMaps=paramGrid, evaluator=evaluator, numFolds=5)cvModel = cv.fit(train) predictions = cvModel.transform(test) print('Test Area Under ROC', evaluator.evaluate(predictions))步驟5 決策樹分類器
決策樹由于易于解釋、處理分類特征、擴展到多類分類設置、不需要特征縮放以及能夠捕獲非線性和特征交互而被廣泛使用。
dt = DecisionTreeClassifier(featuresCol = 'features', labelCol = 'label', maxDepth = 3) dtModel = dt.fit(train) predictions = dtModel.transform(test) predictions.select('age', 'job', 'label', 'rawPrediction', 'prediction', 'probability').show(10)評估我們的決策樹模型
evaluator = BinaryClassificationEvaluator() print("Test Area Under ROC: " + str(evaluator.evaluate(predictions, {evaluator.metricName: "areaUnderROC"})))步驟6 隨機森林分類器
rf = RandomForestClassifier(featuresCol = 'features', labelCol = 'label') rfModel = rf.fit(train) predictions = rfModel.transform(test) predictions.select('age', 'job', 'label', 'rawPrediction', 'prediction', 'probability').show(10) evaluator = BinaryClassificationEvaluator() print("Test Area Under ROC: " + str(evaluator.evaluate(predictions, {evaluator.metricName: "areaUnderROC"})))步驟7 Gradient-boosted樹分類器
gbt = GBTClassifier(maxIter=10) gbtModel = gbt.fit(train) predictions = gbtModel.transform(test) predictions.select('age', 'job', 'label', 'rawPrediction', 'prediction', 'probability').show(10) evaluator = BinaryClassificationEvaluator() print("Test Area Under ROC: " + str(evaluator.evaluate(predictions, {evaluator.metricName: "areaUnderROC"})))Gradient-boosted樹獲得了最好的結果,我們將嘗試使用ParamGridBuilder和CrossValidator對這個模型進行調優。
在此之前,我們可以使用explainParams()打印所有params及其定義的列表,以了解哪些params可用于調優。
總之,我們學習了如何使用PySpark和MLlib pipeline API構建一個二進制分類應用程序。
我們嘗試了四種算法,Gradient Boosting在我們的數據集中表現得最好。
思考
隨機森林和Gradient Boosting都屬于集成學習的算法,為什么在準確率和ROC上,后者明顯好于前者?
GBM采用boosting技術做預測。在bagging技術中,數據集用隨機采樣的方法被劃分成使n個樣本。然后,使用單一的學習算法,在所有樣本上建模。接著利用投票或者求平均來組合所得到的預測。
Bagging是平行進行的。而boosting是在第一輪的預測之后,算法將分類出錯的預測加高權重,使得它們可以在后續一輪中得到校正。這種給予分類出錯的預測高權重的順序過程持續進行,一直到達到停止標準為止。隨機森林通過減少方差(主要方式)提高模型的精度。生成樹之間是不相關的,以把方差的減少最大化。在另一方面,GBM提高了精度,同時減少了模型的偏差和方差。
總結
以上是生活随笔為你收集整理的MLlib 二分类问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql count(*)使用索引和成
- 下一篇: 创建图元