財富二元模型_二元分類 - CSDN

2020-11-27 CSDN技術社區

本節使用決策樹二元分類分析StumbleUpon數據集,預測網頁是暫時性的(ephemeral)或是長青的(evergreen),並調校參數找出最佳參數組合,提高預測準確度。

StumbleUpon Evergreen大數據問題場景分析

StumbleUpon是一個個性化的搜尋引擎,會按用戶的興趣和網頁評分等記錄推薦給你感興趣的網頁,有些網頁是暫時性的,比如新聞,這些文章可能只是在某一段時間會對讀者有意義,而有些則是長青的,讀者會對這些文章有長久興趣

我們這節的目標就是利用決策樹二元分類機器學習,建立模型,並用這個模型來預測網頁是屬於暫時還是長青的,這屬於簡單的二元分類問題。

1、搜集數據

到這個網址去查看數據https://www.kaggle.com/c/stumbleupon/data
註:下載數據需要註冊,註冊時需要科學上網,才能加載到驗證API

複製到項目目錄

cp train.tsv ~/pythonwork/datacp test.tsv ~/pythonwork/datahadoop fs -put *.tsv /user/hduser/data

2、數據準備

必須將原始數據集提取特徵欄位與標籤欄位,建立訓練所需的數據格式LabeledPoint,以隨機方式按照8:1:1分為三個部分:訓練數據集驗證數據集測試數據集
訓練數據集:trainData:以此數據訓練模型
驗證數據集:validationData:作為評估模型使用
測試數據集:testData:作為測試數據使用

讀取數據文件

以YARN模式啟動pyspark

HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop pyspark --master yarn --deploy-mode client

導入數據

rawDataWithHeader = sc.textFile("/user/hduser/stum/data/train.tsv")

註:文件夾需要讀者自己創建

清理數據

從數據文件上看存在以下幾個問題:
1、第一項數據是欄位名
2、每一項數據以"\t"分隔欄位
3、有些欄位無數據,用?代替了

以下是解決步驟

刪除第一項欄位名

header = rawDataWithHeader.first()rawData = rawDataWithHeader.filter(lambda x:x !=header)

刪除雙引號

rData = rawData.map(lambda x: x.replace("\"", ""))

獲取每一行數據欄位

lines = rData.map(lambda x: x.split("\t"))

提取特徵欄位

import numpy as npdef extract_features(field,categoriesMap,featureEnd): # 提取分類特徵欄位 categoryIdx = categoriesMap[field[3]] # 網頁分類轉換為數值 categoryFeatures = np.zeros(len(categoriesMap)) # 初始化categoryFeatures categoryFeatures[categoryIdx] = 1 # 設置List相對應的位置是1 # 提取數值欄位 numericalFeatures=[convert_float(field) for field in field[4:featureEnd]] # 返回「分類特徵欄位」 + 「數值特徵欄位」 return np.concatenate((categoryFeatures,numericalFeatures))def convert_float(x): # 判斷是否為空值數據,如果是返回數值0,不是就轉換為float return (0 if x=="?" else float(x))

創建網頁分類字典

categoriesMap = lines.map(lambda fields: fields[3]).distinct().zipWithIndex().collectAsMap()

提取label標籤欄位

def extract_label(field): label=field[-1] return float(label)

該函數傳入field參數是單項數據,field[-1]獲取最後一個欄位,也就是label欄位,最後返回float(label)轉換為float之後的label

建立訓練評估所需數據

創建LabeledPoint數據

from pyspark.mllib.regression import LabeledPointlabelpointRDD = lines.map( lambda r: LabeledPoint( extract_label(r), extract_features(r,categoriesMap,len(r) - 1)))


以隨機方式將數據分為3部分並返回

(trainData,validationData,testData) = labelpointRDD.randomSplit([8,1,1])

將以上步驟封裝為一個函數PrepareData:

def PrepareData(sc): global Path if sc.master[0:5] == "local": Path = "file:/root/pythonwork/stum/" else: Path = "hdfs://master:9000/user/hduser/stum/" print("Loading data.....") rawDataWithHeader = sc.textFile(Path+"data/train.tsv") header = rawDataWithHeader.first() rawData = rawDataWithHeader.filter(lambda x:x !=header) rData = rawData.map(lambda x: x.replace("\"", "")) lines = rData.map(lambda x: x.split("\t")) print("Total:"+str(lines.count())+" item") categoriesMap = lines.map(lambda fields: fields[3]).distinct().zipWithIndex().collectAsMap() labelpointRDD = lines.map( lambda r: LabeledPoint( extract_label(r), extract_features(r,categoriesMap,len(r) - 1))) (trainData,validationData,testData) = labelpointRDD.randomSplit([8,1,1]) return (trainData,validationData,testData,categoriesMap)

執行

(trainData,validationData,testData,categoriesMap) = PrepareData(sc)

數據暫存

trainData.persist()validationData.persist()testData.persist()

3、訓練模型

from pyspark.mllib.tree import DecisionTreemodel = DecisionTree.trainClassifier(\ trainData, numClasses=2, categoricalFeaturesInfo={},\ impurity="entropy",maxDepth=5,maxBins=5)

4、使用模型進行預測

建立模型後,可以使用此模型預測test.tsv數據。test.tsv只有feature,使用此特徵欄位預測網頁是暫時的或是長青的

def PredictData(sc,model,categoriesMap): print("Loading data...") global Path if sc.master[0:5] == "local": Path = "file:/root/pythonwork/stum/" else: Path = "hdfs://master:9000/user/alex/stum/" print("Loading data.....") rawDataWithHeader = sc.textFile(Path+"data/test.tsv") header = rawDataWithHeader.first() rawData = rawDataWithHeader.filter(lambda x:x !=header) rData = rawData.map(lambda x: x.replace("\"", "")) lines = rData.map(lambda x: x.split("\t")) print("Total:"+str(lines.count())+" item") dataRDD = lines.map(lambda r:(r[0],extract_features(r,categoriesMap,len(r)))) DescDict = { 0:"ephemeral", 1:"evergreen"} for data in dataRDD.take(10): predictResult = model.predict(data[1]) print( "Website: "+str(data[0])+"\n"+\ " ==>Predict: "+str(predictResult)+\ "Notes: "+DescDict[predictResult]+"\n")



執行

print("*******Predicting*********")PredictData(sc,model,categoriesMap)

5、評估準確率

AUC評估

針對二元分類法

有了TPR、FPR就可以繪出ROC曲線圖

AUC就是ROC曲線下的面積

建立scoreAndLabels

score = model.predict(validationData.map(lambda p: p.features))scoreAndLabels=score.zip(validationData.map(lambda p:p.label))scoreAndLabels.take(5)

編寫BinaryClassificationMetrics計算AUC

from pyspark.mllib.evaluation import BinaryClassificationMetricsmetrics = BinaryClassificationMetrics(scoreAndLabels)print("AUC="+str(metrics.areaUnderROC))

將以上兩個步驟封裝成evaluateModel函數

def evaluateModel(model,validationData) score = model.predict(validationData.map(lambda p: p.features)) scoreAndLabels=score.zip(validationData.map(lambda p:p.label)) BinaryClassificationMetrics metrics = BinaryClassificationMetrics(scoreAndLabels) return(metrics.areaUnderROC)

6、調參

建立trainEvaluateModel

from time import timedef trainEvaluateModel(trainData,validationData,impurityParm,maxDepthParm,maxBinsParm): startTime = time() model = DescisionTree.trainClassifier(trainData,numClasses=2,categoricalFeaturesInfo={},impurity=impurityParm,maxDepth=maxDepthParm,maxBins=maxBinsParm) AUC=evaluateModel(model,validationData) duration=time()-startTime print( "training evaluate:"+\ "impurity="+str(impurityParm)+\ "maxDepth="+str(maxDepthParm)+\ "maxBins="+str(maxBinsParm)+"\n"+\ "==>duration="+str(duration)+\ "Result AUC="+str(AUC)) return (AUC,duration,impurityParm,maxDepthParm,maxBinsParm,model)

解釋

運行

(AUC,duration,impurityParm,maxDepthParm,maxBinsParm,model)=\ trainEvaluateModel(trainData,validationData,"entropy",5,5)

評估impurity參數

impurity=["gini","entropy"]maxDepthList=[10]maxBinsList=[10]metric=[trainEvaluateModel(trainData,validationData,impurity,maxDepthList,maxBinsList)] for impurity in impurityList for maxDepth in maxDepthList for maxBins in maxBinsList

將metric轉換為Pandas DataFrame

import pandas as pdIndexList=impurityListdf = pd.DataFrame(metrics,index=IndexList,columns=['AUC','duration','impurity','maxDepth','maxBins','model'])

將參數評估封裝為evalParameter

def evalParameter(trainData,validation,evalparm,impurityList,maxDepthList,maxBinsList): metric=[trainEvaluateModel(trainData,validationData,impurity,maxDepthList,maxBinsList)] for impurity in impurityList for maxDepth in maxDepthList for maxBins in maxBinsList if evalparm=="impurity": IndexList=impurityList[:] elif evalparm=="maxDepth": IndexList=maxDepthList[:] elif evalparm=="maxBins": IndexList=maxBinsList[:] df = pd.DataFrame(metrics,index=IndexList,columns=['AUC','duration','impurity','maxDepth','maxBins','model']) return df

評估所有參數

def evalAllParameter(trainData, validationData,impurityList, maxDepthList, maxBinsList): metric=[trainEvaluateModel(trainData,validationData,impurity,maxDepthList,maxBinsList) for impurity in impurityList for maxDepth in maxDepthList for maxBins in maxBinsList] Smetrics = sorted(metrics,key=lambda k:k[0],reverse=True) bestParameter=Smetrics[0] return bestParameter[5]

調用方式:

是否過度訓練

evaluateModel(model,testData)
如果這個值與訓練階段相差過大,代表過度訓練,如果相差不大,則代表沒問題

相關焦點

  • 一文讀懂二元分類模型評估指標
    推薦閱讀時間:10min~12min文章內容:解讀二元分類模型各種評估指標在分類模型中,有很多關於模型性能的評估指標(evaluation metric),比如 accuracy、precision、recall、f1-score、roc、auc、prc 等等。這裡慢慢梳理下這些指標的含義以及用途。
  • 魔獸世界懷舊服二元法術和非二元法術的區別在哪?法術分類解析
    魔獸世界懷舊服二元法術和非二元法術的區別在哪?很多玩家對於遊戲中法術的機制還不是很了解,想知道什麼是二元法術,二元法術和非二元法術有哪些區別,小編今天為大家帶來了魔獸世界懷舊服法術分類解析,感興趣的玩家快來和小編一起了解一下吧!
  • Logistic回歸分析之二元Logistic回歸
    本次內容將針對二元logistic(logit)回歸進行說明,後續兩篇文章將分別講解有序logistic(logit)和多分類logistic(logit)回歸。 分析完成X與Y的差異關係之後,篩選出有差異的X,然後再放入模型中,進行二元logistic回歸;這樣做的目的有兩個,一是簡化模型,越簡單的模型越容易擬合且效果越好;二是做到心裡有數,提前了解到數據之間的大致關係情況。
  • 二元系統的分類和進化,其恆星的命運取決於哪些因素?
    而它們中大約80%的恆星都是多星系統成員,即兩顆、或多顆恆星所組成的系統,其中最常見的多星系統,便是由兩顆恆星組成的二元星系。比如,當我們抬頭望向頭頂這片天空時所看到的單個光點,其中大約有五分之四的部分,都是由多顆恆星一起旋轉而散發出的光芒。它們的存在不僅對恆星的分類有益,還可能對生命的發展走向帶來影響,所以,我們才更需要了解這些特殊系統的分類和演化,比如,該系統中恆星的命運和哪些因素有關?
  • 二元一次方程組:不要把方法教成技能,把思想教成題型
    我有以下幾個觀點:代入消元和加減消元不僅應用在解方程組,消元是一種廣泛應用的代數變形策略,代入、加減不一定是為了消元;與二元一次方程組有關的實際問題更加去題型化,不能再像講實際問題與一元一次方程那樣按題型分類訓練,那樣不利於發展學生的模型思想;二元一次方程組的解有幾種情況,這個探究可以也應該結合圖形來認識
  • 二元期權是什麼,適合做投資嗎?
    據悉,這類交易所多為現貨黃金、白銀、原油、瀝青、二元期權等的投機交易所。對於現貨黃金、白銀、原油、瀝青這些商品,想必很多投資者都有了解,而「二元期權」又是什麼新事物呢?二元期權是什麼?據財富管理機構嘉豐瑞德的理財師介紹,二元期權是一種不算新鮮的新型金融交易品種,英文稱為「Binary Options」,其最早源自美國。
  • 乾貨|教你如何用Stata做二元選擇模型
    先確定二元選擇模型的類型,通常有Probit模型、Logit模型、Extreme模型等,前面兩種最常用。如果隨機誤差項服從標準正態分布,就用Probit模型;如果隨機誤差項服從邏輯分布,就用Logit模型。當然,事先也不知道隨機誤差項究竟服從何種分布,所以Probit模型和Logit模型任選一種即可,問題不是很大。二元選擇模型是非線性模型,所以參數估計要用最大似然估計法(MLE)。
  • 《二元一次方程組》教案
    《二元一次方程組》教案一、教學目標【知識與技能】掌握二元一次方程與二元一次方程組的概念,並了解它們的解,能正確地找出二元一次方程組的解。【過程與方法】通過類比學習、自主探究、合作交流的過程,提升類比學習的能力,樹立探究的意識。
  • 馬千子: 二元一次方程組
    迎來的第一課就是二元一次方程組。          二元一次方程是含有兩個未知數,並且所含未知數的項的次數都是一的方程叫做二元一次方程。         二元一次方程組是共含有兩個未知數的兩個一次方程所組成的方程。其中一次方程是指包含一元一次方程和二元一次方。         適合一個二元一次方程的一組未知數的值,叫做這個兩元一次方程的一個解。
  • 二元合金混合焓數據
    由於熵值的不同,我們可以將合金劃分為高熵合金、中熵合金和低熵合金,對於合金熵值的計算我們可以通過摩爾熵變公式或者正規熔體模型來進行計算,但是在對高熵合金的混合焓進行計算時需要清楚二元合金之間的混合焓數據。
  • 「自然—社會」二元水循環耦合規律研究啟動
    國家自然科學基金重點項目——「自然—社會」二元水循環耦合規律研究日前在京啟動。
  • 《二元一次方程組》說課稿
    一、說教材首先談談我對教材的理解,《二元一次方程組》是人教版初中數學七年級下冊第八章第一節的內容,本節課的內容是二元一次方程組的概念以及二元一次方程組的解。在此之前學習了一元一次方程和解方程的步驟,為本節課打下了良好的基礎。學了本節課為後面的解二元一次方程的方法做下鋪墊。因此本節課有著承上啟下的作用。二、說學情接下來談談學生的實際情況。
  • 二元二次方程組(一)
    現在,我們來看一下這個方程組的構成,方程(1)是一個一元二次方程,方程(2)是一個二元一次方程,兩個方程共有兩個未知數且未知數的最高次數為2,我們把這樣的由兩個未知數的一個二次方程和一個次數不超過二次的方程所組成的方程組稱為二元二次方程組。例  判斷下列方程組是否為二元二次方程組
  • 廣義線性模型|二分類廣義線性模型—因變量是二分類變量
    圖2 廣義線性模型的命令調用  首先因本例小白鼠死亡與否是二分類數據,服從二項分布,可用probit回歸分析,因而在模型類型對話框中選擇「二元概率圖3 模型類型選項  不同類型、不同分布的數據所使用的廣義線性模型大不相同。
  • 二元一次方程組的解法
    二元一次方程的解法,解題思想就是消元,就是把二元一次方程變成一元一次方程,這樣就能解出一個未知數。
  • 資金有限,二元母豬和三元母豬怎麼選?這麼選即少花錢又都是二元
    大家好,我是每天學點豬病,目前是某大型養豬公司的生產技術員,昨天有粉絲給我留言問,資金有限,二元母豬和三元母豬怎麼來選。 1. 什麼是二元母豬,三元母豬?
  • 二元對立視角下的《了不起的蓋茨比》:偉大而孤獨,華麗而荒誕
    《了不起的蓋茨比》中的二元對立(一) 小說主題的二元對立表面上看,《了不起的蓋茨比》是在講一對男女之間失敗的愛情故事。實際上,這部小說所涵蓋的主題要比這個問題大得多,也並不那麼浪漫。雖然故事僅僅發生在紐約附近的一個聚居區,時間上主要分布在1922年的幾個月,但它卻是對當時整個美國社會的反思,表現了作者對一個物質空前繁榮、精神相當空虛的美國社會的人文關懷。
  • 二元制大專大學首頁推薦
    二元制大專大學首頁推薦,經省人力與社會保障廳批准創辦福建省閩海職業培訓學校(具有獨立法人資格)。 全日制大專擴招考試內容包括文化素質測驗和工作技能測驗,由各招生院校安排施行。全日制大專什麼意思?最近,伴隨著高考的來臨。2020專科什麼專業好?大學生公寓中心區還擁有2萬平米的生態園。
  • 2019年中考數學二元一次方程組
    · 二元一次方程知識點 二元一次方程的定義 一、二元一次方程(組)的相關概念 1.二元一次方程:含有兩個未知數並且未知項的次數是1的方程叫做二元一次方程。 2.二元一次方程組:二元一次方程組兩個二元—次方程合在一起就組成了一個二元一次方程組。
  • 二元二次方程組解法(一)
    上一期,我們知道了長什麼樣的方程組是二元二次方程組以及如何判定。從這一期開始,我們要探討如何解二元二次方程組。