在格物匯之前發表的《工業大數據挖掘的利器——Spark MLlib》中提到,Spark 的MLlib組件能夠對工業現場海量數據進行高效挖掘,快速呈現結果給業務分析人員。接下來將向大家介紹SparkMLlib 中的GBDT算法,并將應用該算法對工業數據進行代碼實戰。
1算法概念
GB(Gradient Boosting)梯度提升算法,GB 共需要進行M次迭代,通過采用梯度下降的方法,每次迭代向損失函數的負梯度方向進行移動,從而使損失函數越來越小,進而使模型越來越精確。算法偽代碼如下:
GB算法跟原始的Boosting算法相比較,還是有比較明顯的區別。
Boosting算法開始的時候,是會給每個樣本附上權重的,在每次迭代的時候就會增加錯的樣本的權重,減少對的樣本的權重,經過N次迭代之后,會得到N個分類器,然后我們再將他們組合起來,得到最終模型。
GB算法與Boosting區別是,他的每一次迭代的目標都是減少上一次的殘差,所以在殘差減少的方向上建立一個新的模型。在GB算法框架上加入決策樹,就是GBDT(GradientBoost Decision Tree)算法。
GBDT主要的優點有:
1) 可以靈活處理各種類型的數據,包括連續值和離散值。
2) 在相對少的調參時間情況下,預測的準備率也可以比較高。這個是相對SVM來說的。
3)使用一些健壯的損失函數,對異常值的魯棒性非常強。比如 Huber損失函數和Quantile損失函數。
4) 很好的利用了弱分類器進行級聯。
5) 充分考慮的每個分類器的權重。
6) 可以得到變量間的重要性排序。
GBDT的主要缺點有:
1)由于弱學習器之間存在依賴關系,難以并行訓練數據,不過可以通過自采樣的SGBT來達到部分并行。
1完整代碼實例
工業生產中,產品在制程過程中會有很多特性值,如果能對產品的特性值及時進行預測,得到特性值的具體數值,那么就會幫組業務人員知曉產品的質量,實現產品的全檢,并能防止異常產品后流,造成不必要的浪費。
本次實戰代碼的采用的數據是半導體制程中某一道工序的機臺的制程參數值,通過采用SparkMLlib中的GBDT算法對工業現場機臺的制程參數進行建模,預測出經過該機臺生產之后產品的膜層厚度。
packageSparkML
importcommon.Logger
importorg.apache.spark.ml.Pipeline
importorg.apache.spark.ml.evaluation.{BinaryClassificationEvaluator,RegressionEvaluator}
importorg.apache.spark.ml.feature.VectorAssembler
importorg.apache.spark.ml.regression.GBTRegressor
importorg.apache.spark.ml.tuning.{CrossValidator,ParamGridBuilder}
importorg.apache.spark.sql.{Row,SparkSession}
importscala.collection.mutable.ArrayBuffer
/**
* Created by huanghuan01 on 2019/3/27.
*/
objectgbdtDemoextendsLogger{
defmain(args: Array[String]):Unit= {
valspark= SparkSession
.builder()
.enableHiveSupport()
.master("local[4]")
.appName("gbdtDemo")
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
varrawData= spark.read.format("csv")
.option("header","true")
.load("E:\\sampleData.csv")
valfieldNames= rawData.schema.map(f=>s"${f.name}").toArray
valcastBuffer:ArrayBuffer[String] = ArrayBuffer()
for(i<-0until fieldNames.length){
valcast_str="cast("+ fieldNames(i) +" as double) as "+ fieldNames(i)
castBuffer.append(cast_str)
}
valcastArr= castBuffer.toArray
valinputData = rawData.selectExpr(castArr:_*)
valfeatureFieldNames= fieldNames.filter(!_.contains("label"))
valfeatureIndexer=newVectorAssembler()
.setInputCols(featureFieldNames)
.setOutputCol("featureIndexer")
valgbt=newGBTRegressor()
.setLabelCol("label")
.setFeaturesCol("featureIndexer")
valArray(trainingData,testData) =inputData.randomSplit(Array(0.8,0.2))
valpipline =newPipeline()
.setStages(Array(featureIndexer,gbt))
valparamGrid =newParamGridBuilder()
.addGrid(gbt.maxIter,Array(30,50,100,200))
.addGrid(gbt.maxDepth,Array(3,7,9))
.addGrid(gbt.stepSize,Array(0.01,0.05,0.1))
.build()
valcv =newCrossValidator()
.setEstimator(pipline)
.setEvaluator(newRegressionEvaluator())
.setNumFolds(5)
.setEstimatorParamMaps(paramGrid)
valmodel =cv.fit(trainingData)
valpredictions =model.transform(testData)
predictions.select("label","prediction").show(100,false)
valevaluator =newRegressionEvaluator()
.setLabelCol("label")
.setPredictionCol("prediction")
.setMetricName("mae")
val mae = evaluator.evaluate
(predictions)
log.warn(s"The mae is : ${mae}")
val predictionAndLabels =
predictions
.select("prediction",
"label")
.map { case Row(prediction:
Double, label: Double) =>
(prediction, label) }
val mape = math.abs
(predictionAndLabels.map
{ x => math.abs((x._1 - x._2) /
x._1) }.mean())
log.warn(s"The mape is :
${mape}")
val pipLine = model.bestModel.
asInstanceOf[org.apache.spark.
ml.PipelineModel]
}}
模型最后輸出模型性能指標如下:
Mape(Mean Absolute Percentage Error):0.23%
通過上圖模型輸出的預測值與實際值對比,發現預測出來的產品膜厚的數值走勢跟實際數值走勢基本符合,mape達到0.5%以內,擬合度相當可觀,后續還可以通過樣本篩選以及特征工程等手段對該模型進行進一步調優。
在模型達到業務需求的擬合度等指標后,通過該模型進行部署,實現產品的“實時全檢”,從而實現產品質量的全面監控,杜絕異常產品后流;與工廠內的抽檢系統結合后,降低產品的抽檢率,提高工廠的效率。
GBDT算法的用途還是比較廣泛的,它不僅可以處理分類問題,能對線性與非線性回歸問題進行處理,還能通過輸出變量間重要因子排序,方便業務人員快速定位異常變量。在工業現場的頑固異常分析還是產品特性預測等領域,GBDT算法確實是很值得數據分析人員考慮的一種算法。
本文作者:
格創東智大數據工程師黃歡(轉載請注明作者及來源)
-
算法
+關注
關注
23文章
4600瀏覽量
92646 -
智能制造
+關注
關注
48文章
5483瀏覽量
76261 -
工業互聯網
+關注
關注
28文章
4299瀏覽量
94050 -
SPARK
+關注
關注
1文章
105瀏覽量
19878 -
工業大數據
+關注
關注
0文章
72瀏覽量
7826 -
GBDT
+關注
關注
0文章
13瀏覽量
3884
發布評論請先 登錄
相關推薦
評論