大數據【企業級360°全方位用戶畫像】之USG模型和決策樹分類算法

寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的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模型和機器學習中的決策樹算法。後續會藉助決策樹,爲大家帶來如何在用戶畫像中開發用戶購物性別的標籤,敬請期待😎

        如果以上過程中出現了任何的紕漏錯誤,煩請大佬們指正😅

        受益的朋友或對大數據技術感興趣的夥伴記得點贊關注支持一波🙏

        希望我們都能在學習的道路上越走越遠😉
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章