寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,
寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的萌新
。由於水平有限,博客中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!個人小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我還是希望自己能夠做得更好,因爲一天的生活就是一生的縮影
。我希望在最美的年華,做最好的自己
!
在之前的一篇博客《大數據【企業級360°全方位用戶畫像】之RFM模型和KMeans聚類算法》中,博主爲大家帶來了KMeans聚類算法的介紹。並在之後,基於不同的模型開發標籤,例如RFM
,RFE
,PSM
,都使用到了KMeans算法。
本篇博客,我們來認識一種叫做USG
的模型,併爲大家簡單介紹下關於決策樹算法原理和實現。
文章目錄
USG模型引入
USG(User Shopping Gender)
1.1 AI驅動的電商用戶模型
首先帶領大家瞭解一下,如何通過大數據來確定用戶的真實性別。
我們經常談論的用戶精細化運營,到底是什麼?簡單來講,就是將網站的每個用戶標籤化,製作一個屬於他自己的網絡身份證。然後,運用人員通過身份證來確定活動的投放人羣,圈定人羣範圍,更爲精準的用戶培養和管理。當然,身份證最基本的信息就是姓名,年齡和性別,與現實不同的是,網絡上用戶填寫的資料不一定完全準確,還需要進行進一步的確認和評估。
確定性別這件事很重要,簡單舉個栗子,比如店鋪想推薦新品的Bra,如果粗糙的全部投放人羣或者投放到不準確性別的人羣,那後果可想而知了。下面來介紹一下具體的識別思路。
1.1.1 用戶畫像需要的數據
用戶平時在電商網站的購物行爲、瀏覽行爲、搜索行爲,以及訂單購買情況都會被記錄在案,探查其消費能力,興趣等。數據歸類後,一般來講,可以通過三類數據對用戶進行分羣和定義。
1、用戶信息
社會特徵:馬克思的人性觀把人分爲社會屬性和自然屬性。社會特徵主要指的是人在社會上的階級屬性,當然也包括服從性、依賴性或者自覺性等,這是人類發展的必然的基本要求。
自然特徵:也可以說成是人的生物性,通常來講可以是食慾,物慾或者購買慾,自我保存能力。但不同人會有不同的自然特徵,比如學習能力和邏輯思維等。
興趣特徵:對於電商來講,主要是對某件商品,某個品牌或者品類的興趣程度,如加購、瀏覽、收藏、搜索和下單行爲。
消費特徵:消費能力的評估,消費傾向的評估,能夠判斷用戶的消費層級,是高消費力還是低消費力。
2、商品
商品屬性:基本信息,品類,顏色尺碼型號等。
商品定位:商品層級,是否爲高中低端,商品類型傾向於哪類客戶,區域或者其他的特徵。最後通過以上的信息來獲取用戶信息,判斷其具體的畫像特徵,然後得到類似於這樣子的網絡身份證。
通常,拿到數據後,我們會將每個環節進行拆解,落實到具體的行動策略上。大體可以根據以下流程進行模型的預估:
業務目標: 精準投放,針對已有產品,尋找某性別偏好的精準人羣進行廣告投放。
技術目標: 對用戶購物性別識別:男性,女性,中性
解決思路:選擇一種分類算法,建立機器學習算法模型,對模型進行應用
線上投放:對得到的數據進行小範圍內的測試投放,初期不宜過大擴大投放範圍
效果分析:對投放的用戶進行數據分析,評估數據的準確性。若不夠完美,則需要重新建模和測試。
1.1.2 如何理解建模過程
重點來了,雖然能夠通過用戶的行爲、購買和興趣數據,瞭解用戶的基本信息,但是仍然不清楚如何建模?用什麼語言建模?其實,購物性別的區分使用的是spark,但是機器學習算法也有很多分類,包含邏輯迴歸,線性支持向量機,樸素貝葉斯模型和決策樹。那麼,又該如何選擇呢?其中,決策樹的優點較多,主要是其變量處理靈活,不要求相互獨立。可處理大維度的數據,不用預先對模型的特徵有所瞭解。對於表達複雜的非線性模式和特徵的相互關係,模型相對容易理解和解釋。看起來決策樹的方法最適合區分性別特徵了,所以決定用決策樹進行嘗試。
什麼是決策樹?簡單來講,是通過訓練數據來構建一棵用於分類的樹,從而對未知數據進行高效分類。可以從下面的圖瞭解決策樹的工作原理。
構造決策樹的步驟爲:
通過訓練數據來構建一棵用於分類的樹,從而對未知數據進行高效分類。
以上步驟中,能夠得出一個結論,在構建決策樹的過程中,最重要的是如何找到最好的分割點。決策樹值得注意的問題是過擬合問題,整個算法必須解決「如何停止分割」和「如何選擇分割」兩個關鍵問題。
最簡單的做法就是設定樹的深度或枝葉的最少樣本量。但是,過少的樣本量又不具有代表性,所以一般情況,可以使用交叉驗證的方法。交叉驗證就是可以使用一部分數據用於模型的訓練,另一部分數據可以用來評估模型的性能。業內常用的劃分方法是講樣本進行50/50分,60/40分或者80/20分。
1.1.3 模型確立過程
在建模前期,首要考慮的事情就是先確定指標,以及對樣本的定義。購物性別指的是什麼?通過哪些數據來確定購物性別,樣本的準確性,如何驗證數據的可信度等。
1.1.4 購物性別的定義
先看下圖,具體的邏輯可從圖中查看。一般來講,用戶填寫的資料不一定真實,我們對他/她的性別數據持懷疑態度,所以,就需要其他數據進行輔助證明其性別。
訂單數據能夠真實反映用戶的購買心態,預測購買行爲,並且能夠通過購買商品的所屬類別,判斷用戶的購買傾向,最後得到性別特徵類目。不過本文就不展開探討甄別特徵類目的區分方法了。
根據數據結果,最終,確認了購物性別的定義。分爲:
購物性別男:N月購買的男性特徵類目子下單數> N月購買的女性特徵類目子下單數
購物性別女:N月購買的男性特徵類目子下單數> N月購買的女性特徵類目子下單數
購物性別中性:未下單男女特徵類目
N需要具體根據業務場景來定。
1.1.5 建模數據準備過程
本節是具體的操作過程,模型的實操階段。一般來講,不同模型的訓練其實大體雷同。從技術上來講,各家算法大多使用sparkmllib,不同點是所運算的模型都是針對於場景來定的。
在全部樣本中,取80%的數據用於訓練模型
在全部樣本中,取20%的數據用戶數據測試
這種方式可以更好的根據數據的規模,提高模型的準確性
1.1.6 模型效果分析
行業內當前採用數據挖掘、機器學習和推薦系統中的評測指標—準確率(Precision)、召回率(Recall),準確率是應用最廣的數據指標,也很清晰易懂,以男性爲例。
準確率=命中的男性用戶數量/所有預測男性數量,一般來講,準確率可以評估模型的質量,他是很直觀的數據評價,但並不是說準確度越高,算法越好。
召回率=命中的男性用戶數量/所有男性數量,反映了被正確判定的正例佔總的正例的比重。模型建立完後,需根據模型的結果與預期的對比,進行調優。
1.1.7 回顧總結
購物性別定義對於用戶精準營銷十分重要,疑難雜症,對症下藥,才能出現更好的療效。
對於新手來說,初期一定是對模型性能及效果分析不是很熟練,可先用小數據量進行測試, 走通全流程建表要規範,方便後期批量刪除,因爲建模是個反覆的過程。
根據各類參數的評估結果,以及人工經驗選定的模型參數,建立模型。值得注意的是,決策樹的深度不要過深,以防止過擬合的問題。
決策樹分類算法詳解
2.1 概念入門
在講解其算法之前,我們需要掌握其常見的幾個概念。
- 數據
“承載了信息的東西”纔是數據。
- 信息
信息是用來消除隨機不定性的東西。
- 信息量
這裏涉及到兩個計算公式,可以分別通過事件發生的數量和概率來獲得信息量。計算出的信息量單位都是bit,也就是比特。
m 指的是可能的數量(幾種可能性), I就是信息量。
另一個公式
P指的是事件的概率
- 信息熵
信息的不確定性可以用熵來表示,即信息熵是信息雜亂程度的描述。
越不確定,信息熵越大,越確定,信息熵越小
計算信息熵的公式也有兩個
其中pi概率,Logpi 是信息量。
另外一個公式是:
信息熵的計算公式爲:所有的事件發生的概率 * 事件的信息量的總和
2個球隊比賽的信息熵
32個球隊比賽的信息熵
- 小結
- 什麼是信息增益??
我們計算信息增益的大致過程如下:
上圖中已經透露出,某個固定值與信息熵的差值便是這個位置的信息增益。
但是這個固定值是怎麼計算出來的呢?
原來這個固定值指的是不參考任何特徵,直接根據結果計算信息熵(整體的信息熵)。在下邊有一個決策樹的實例中會體現出計算的過程,大家可以留意下。
再用這個固定值值 - 某一特徵信息熵便得到了信息增益。
信息增益越大,數據越純粹,這個判斷,特徵的位置越靠前。
2.2 算法原理
先讓我們來看這樣幾篇報道,對於決策樹有一個大概的認知。
決策樹是最經典的機器學習模型之一。它的預測結果容易理解, 易於向業務部門解釋。預測速度快,可以處理類別型數據和連續型數據。在機器學習的數據挖掘類求職面試中,決策樹是面試官最喜歡的面試題之一。
2.3 快速體驗
之前我們在初次介紹KMeans聚類算法的時候,在最後利用該算法對鳶尾花數據集進行了聚類分析。看了本篇博客,學習了決策樹分類算法,那我們也重拾起曾經的數據集,用Java來體驗一波“決策樹”的快感。
需要注意的是,我們本次讀取的數據集iris_tree.csv
如下所示,想要數據集的朋友可以私信獲取。
具體代碼:
import org.apache.spark.ml.{Pipeline, PipelineModel}
import org.apache.spark.ml.classification.{DecisionTreeClassificationModel, DecisionTreeClassifier}
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{StringIndexer, StringIndexerModel, VectorAssembler}
import org.apache.spark.sql.types.DoubleType
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
/*
* @Author: Alice菌
* @Date: 2020/7/2 15:03
* @Description:
用決策樹對鳶尾花數據進行分類
*/
object IrisTree {
def main(args: Array[String]): Unit = {
// 監督學習如何實現
// 訓練集,測試集如何使用
// 成功率(準確率)
// 1、初始化SparkSession
val spark: SparkSession = SparkSession.builder().appName("IrisTree").master("local[*]").getOrCreate()
// 設置日誌級別
spark.sparkContext.setLogLevel("WARN")
// 導入隱式轉換
import spark.implicits._
// 2、讀取數據
val dataSource: DataFrame = spark.read
.csv("file:///E:\\iris_tree.csv")
.toDF("Sepal_Length", "Sepal_Width", "Petal_Length", "Petal_Width", "Species")
.select('Sepal_Length cast DoubleType, //字符串類型無法直接計算,需要將其傳爲doubleType
'Sepal_Width cast DoubleType,
'Petal_Length cast DoubleType,
'Petal_Width cast DoubleType,
'Species
)
//展示一些數據
dataSource.show()
//+------------+-----------+------------+-----------+-----------+
//|Sepal_Length|Sepal_Width|Petal_Length|Petal_Width| Species|
//+------------+-----------+------------+-----------+-----------+
//| 5.1| 3.5| 1.4| 0.2|Iris-setosa|
//| 4.9| 3.0| 1.4| 0.2|Iris-setosa|
//| 4.7| 3.2| 1.3| 0.2|Iris-setosa|
//| 4.6| 3.1| 1.5| 0.2|Iris-setosa|
//| 5.0| 3.6| 1.4| 0.2|Iris-setosa|
//| 5.4| 3.9| 1.7| 0.4|Iris-setosa|
//| 4.6| 3.4| 1.4| 0.3|Iris-setosa|
// 3、標籤處理(數據不能直接使用,需要將最終的標籤處理成數字。)
val SpeciesToLabel: StringIndexerModel = new StringIndexer()
.setInputCol("Species")
.setOutputCol("label")
.fit(dataSource)
//4、將特徵數據處理成向量
val features: VectorAssembler = new VectorAssembler()
.setInputCols(Array("Sepal_Length", "Sepal_Width", "Petal_Length", "Petal_Width"))
.setOutputCol("features")
//5、初始化決策樹,進行分類
val decisionTree: DecisionTreeClassifier = new DecisionTreeClassifier() //創建決策樹對象
.setFeaturesCol("features") //設置特徵列
.setPredictionCol("prediction") //設置預測後的列名
.setMaxDepth(4) //設置深度
//------查看----------
//6、構建一個 PipeLine 將 第3 4 5 步驟連起來
val pipeline: Pipeline = new Pipeline().setStages(Array(SpeciesToLabel,features,decisionTree))
//7、將原始數據拆分成訓練集和測試集
//將數據切分成80%的訓練集和20%的測試集
val Array(trainDatas,testDatas): Array[Dataset[Row]] = dataSource.randomSplit(Array(0.8,0.2))
//8、使用 PipLine 對訓練集進行訓練,使用測試集進行測試
//使用訓練數據進行訓練,得到一個模型
val model: PipelineModel = pipeline.fit(trainDatas)
//使用測試集進行測試
val testDF: DataFrame = model.transform(testDatas)
testDF.show()
//+------------+-----------+------------+-----------+---------------+-----+-----------------+--------------+-------------+----------+
//|Sepal_Length|Sepal_Width|Petal_Length|Petal_Width| Species|label| features| rawPrediction| probability|prediction|
//+------------+-----------+------------+-----------+---------------+-----+-----------------+--------------+-------------+----------+
//| 4.3| 3.0| 1.1| 0.1| Iris-setosa| 0.0|[4.3,3.0,1.1,0.1]|[38.0,0.0,0.0]|[1.0,0.0,0.0]| 0.0|
//| 4.4| 3.2| 1.3| 0.2| Iris-setosa| 0.0|[4.4,3.2,1.3,0.2]|[38.0,0.0,0.0]|[1.0,0.0,0.0]| 0.0|
//| 4.7| 3.2| 1.3| 0.2| Iris-setosa| 0.0|[4.7,3.2,1.3,0.2]|[38.0,0.0,0.0]|[1.0,0.0,0.0]| 0.0|
//| 4.9| 3.0| 1.4| 0.2| Iris-setosa| 0.0|[4.9,3.0,1.4,0.2]|[38.0,0.0,0.0]|[1.0,0.0,0.0]| 0.0|
//| 5.0| 2.0| 3.5| 1.0|Iris-versicolor| 1.0|[5.0,2.0,3.5,1.0]|[0.0,35.0,0.0]|[0.0,1.0,0.0]| 1.0|
//| 5.0| 3.2| 1.2| 0.2| Iris-setosa| 0.0|[5.0,3.2,1.2,0.2]|[38.0,0.0,0.0]|[1.0,0.0,0.0]| 0.0|
//| 5.1| 3.4| 1.5| 0.2| Iris-setosa| 0.0|[5.1,3.4,1.5,0.2]|[38.0,0.0,0.0]|[1.0,0.0,0.0]| 0.0|
//9、查看分類的成功的百分比
val evaluator: MulticlassClassificationEvaluator = new MulticlassClassificationEvaluator() //多類別評估器
.setLabelCol("label") //設置原始數據中自帶的label
.setPredictionCol("prediction") //設置根據數據計算出來的結果“prediction”
val Score: Double = evaluator.evaluate(testDF) //將測試的數據集DF中自帶的結果與計算出來的結果進行對比得到最終分數
println(">>>>>>>>>>>>>>>>>>>>>>> "+Score)
//>>>>>>>>>>>>>>>>>>>>>>> 0.9669208211143695
val decisionTreeClassificationModel: DecisionTreeClassificationModel = model.stages(2).asInstanceOf[DecisionTreeClassificationModel]
// 輸出決策樹
println(decisionTreeClassificationModel.toDebugString)
//DecisionTreeClassificationModel (uid=dtc_d936bd9c91b5) of depth 4 with 13 nodes
// If (feature 2 <= 1.9)
// Predict: 0.0
// Else (feature 2 > 1.9)
// If (feature 2 <= 4.7)
// If (feature 3 <= 1.6)
// Predict: 1.0
// Else (feature 3 > 1.6)
// Predict: 2.0
// Else (feature 2 > 4.7)
// If (feature 2 <= 4.9)
// If (feature 3 <= 1.5)
// Predict: 1.0
// Else (feature 3 > 1.5)
// Predict: 2.0
// Else (feature 2 > 4.9)
// If (feature 3 <= 1.6)
// Predict: 2.0
// Else (feature 3 > 1.6)
// Predict: 2.0
}
}
結語
本篇博客博主地簡單爲大家介紹了一下用戶畫像項目中的USG
模型和機器學習中的決策樹
算法。後續會藉助決策樹,爲大家帶來如何在用戶畫像中開發用戶購物性別的標籤,敬請期待😎
如果以上過程中出現了任何的紕漏錯誤,煩請大佬們指正😅
受益的朋友或對大數據技術感興趣的夥伴記得點贊關注支持一波🙏
希望我們都能在學習的道路上越走越遠😉