简历项目-
文章目錄
- 項目一:電商廣告推薦系統
- 一、數據集
- 項目實現分析
- 二、根據用戶行為數據創建ALS模型并召回商品
- 用戶行為數據拆分(pv,fav,cart,buy)
- 預處理behavior_log數據集
- 根據用戶對類目偏好打分訓練ALS模型
- 根據用戶對品牌偏好打分訓練ALS模型
- 三. CTR預估數據準備
- 分析并預處理raw_sample數據集
- 分析并預處理ad_feature數據集(空值NULL->-1)
- 分析并預處理user_profile數據集(null)——隨機森林——困難
- 四. LR實現CTR預估(12個特征)——改進
- 五. 離線推薦數據緩存
- 六. 實時產生推薦結果
- 七、推薦算法
- 協同過濾(召回)
- 矩陣分解(召回)
- LR+GBDT(排序)
- FM、FFM
- Wide&deep
- 項目二: RNN步態認證
- 項目簡介
- LSTM、GRU
- 梯度消失、梯度爆炸
- 梯度優化算法
- dropout防止過擬合
- 評價指標
- 機器學習基礎
- 1. 邏輯回歸
- 2. 決策樹
- 3. 支持向量機
- 4. 集成學習
- 5.隨機森林
- 6. GBDT
- 7. XGB、LGB
- 8. Adaboost
項目一:電商廣告推薦系統
- 離線推薦
- 對召回結果排序
- 為每一個用戶都進行召回并排序,把排好順序的結果放到數據庫中
- 如果需要推薦結果的時候,直接到數據庫中按照user_id查詢,返回推薦結果
- 優點:結構比較簡單,推薦服務只需要不斷計算,把結果保存到數據庫中即可
- 缺點 實時性差,如果數據1天不更新 1天之內推薦結果一樣的,不能反映用戶的實時興趣
- 實時推薦
- 排序模型加載好
- 召回階段的結果緩存
- 所有用戶的特征緩存
- 所有物品的特征緩存
- 把推薦的服務暴露出去(django flask)需要推薦結果的服務 把用戶id傳遞過來
- 根據id找到召回結果
- 根據id找到緩存的用戶特征
- 根據召回結果的物品Id 找到物品的特征
- 用戶特征+物品特征-》邏輯回歸模型 就可以預測點擊率
- 所有召回的物品的點擊率都預測并排序 推薦topN
- 實時通過LR模型進行排序的好處:
- 隨時修改召回集
- 隨時調整用戶的特征
- 當用戶需要推薦服務的時候,獲取到最新的召回集合用戶特征 得到最新的排序結果 更能體現出用戶的實時興趣
一、數據集
-
原始樣本骨架 raw_sample
淘寶網站中隨機抽樣了114萬用戶8天內的廣告展示/點擊日志(2600萬條記錄),構成原始的樣本骨架。 字段說明如下: - user_id:脫敏過的用戶ID;
- adgroup_id:脫敏過的廣告單元ID;
- time_stamp:時間戳;
- pid:資源位;
- noclk:為1代表沒有點擊;為0代表點擊;
- clk:為0代表沒有點擊;為1代表點擊;
-
廣告基本信息表ad_feature
本數據集涵蓋了raw_sample中全部廣告的基本信息(約80萬條目)。字段說明如下:
- adgroup_id:脫敏過的廣告ID;
- cate_id:脫敏過的商品類目ID;
- campaign_id:脫敏過的廣告計劃ID;
- customer_id: 脫敏過的廣告主ID;
- brand_id:脫敏過的品牌ID;
- price: 寶貝的價格
-
用戶基本信息表user_profile
本數據集涵蓋了raw_sample中全部用戶的基本信息(約100多萬用戶)。字段說明如下:
- userid:脫敏過的用戶ID;
- cms_segid:微群ID;
- cms_group_id:cms_group_id;
- final_gender_code:性別 1:男,2:女;
- age_level:年齡層次; 1234
- pvalue_level:消費檔次,1:低檔,2:中檔,3:高檔;
- shopping_level:購物深度,1:淺層用戶,2:中度用戶,3:深度用戶
- occupation:是否大學生 ,1:是,0:否
- new_user_class_level:城市層級
-
用戶的行為日志behavior_log
本數據集涵蓋了raw_sample中全部用戶22天內的購物行為(共七億條記錄)。字段說明如下:user:脫敏過的用戶ID; time_stamp:時間戳; btag:行為類型, 包括以下四種: ? 類型 | 說明
? pv | 瀏覽 ? cart | 加入購物車 ? fav | 喜歡 ? buy | 購買
cate_id:脫敏過的商品類目id; brand_id: 脫敏過的品牌id; 這里以user +
time_stamp為key,會有很多重復的記錄;這是因為我們的不同的類型的行為數據是不同部門記錄的,在打包到一起的時候,實際上會有小的偏差(即兩個一樣的time_stamp實際上是差異比較小的兩個時間)
用前面7天的做訓練樣本(20170506-20170512),用第8天的做測試樣本(20170513)
其中一個廣告ID對應一個商品(寶貝),一個寶貝屬于一個類目,一個寶貝屬于一個品牌。
項目實現分析
主要包括
- 一份廣告點擊的樣本數據raw_sample.csv:體現的是用戶對不同位置廣告點擊、沒點擊的情況
- 一份廣告基本信息數據ad_feature.csv:體現的是每個廣告的類目(id)、品牌(id)、價格特征
- 一份用戶基本信息數據user_profile.csv:體現的是用戶群組、性別、年齡、消費購物檔次、所在城市級別等特征
- 一份用戶行為日志數據behavior_log.csv:體現用戶對商品類目(id)、品牌(id)的瀏覽、加購物車、收藏、購買等信息
- 離線處理業務流
- raw_sample.csv ==> 歷史樣本數據
- ad_feature.csv ==> 廣告特征數據
- user_profile.csv ==> 用戶特征數據
- raw_sample.csv + ad_feature.csv + user_profile.csv ==> CTR點擊率預測模型(邏輯回歸模型)
- behavior_log.csv ==> 評分數據 ==> user-cate/brand評分數據 ==> 協同過濾召回 ==>邏輯回歸 排序top-N cate/brand ==> 關聯廣告
- 協同過濾召回 ==> top-N cate/brand ==> 關聯對應的廣告完成召回 (為每個用戶召回關聯的廣告)
- 在線處理業務流
- 數據處理部分:
- 實時行為日志 ==> 實時特征 ==> 緩存
- 實時行為日志 ==> 實時商品類別/品牌 ==> 實時廣告召回集 ==> 緩存
- 推薦任務部分:
- CTR點擊率預測模型(離線訓練好的) + 廣告/用戶特征(緩存)(離線召回了一些)+ 對應的召回集(緩存) ==> 點擊率排序 ==> top-N 廣告推薦結果
- 數據處理部分:
- Flume:日志數據收集
- Kafka:實時日志數據處理隊列
- HDFS:存儲數據
- Spark SQL:離線處理
- Spark ML:模型訓練
- Redis:緩存
二、根據用戶行為數據創建ALS模型并召回商品
用戶行為數據拆分(pv,fav,cart,buy)
分批處理,chunksize=100
預處理behavior_log數據集
- 創建spark session
- 從hdfs中加載csv文件為DataFrame
- 從hdfs加載數據為dataframe,并設置結構
- 分析數據集字段的類型和格式
- 統計每個用戶對各個品牌的pv、fav、cart、buy數量并保存結果
pivot透視操作,把某列里的字段值轉換成行并進行聚合運算(pyspark.sql.GroupedData.pivot)
# 統計每個用戶對各類商品的pv、fav、cart、buy數量 cate_count_df = behavior_log_df.groupBy(behavior_log_df.userId, behavior_log_df.cateId).pivot("btag",["pv","fav","cart","buy"]).count() cate_count_df.printSchema() # 此時還沒有開始計算根據用戶對類目偏好打分訓練ALS模型
- 根據您統計的次數 + 打分規則 ==> 偏好打分數據集 ==> ALS模型
- 處理每一行數據
- 返回一個PythonRDD類型
- 用戶對商品類別的打分數據cate_rating_df
- 基于Spark的ALS隱因子模型進行CF評分預測
ALS模型
是一種基于模型的推薦算法,基于最小二乘法對稀疏矩陣進行分解,可以依照分解的兩個矩陣,對新的用戶和物品數據進行評估。分解的兩個矩陣的隱因子,可以看做是用戶或物品的隱含特征,例如可以是用戶的性格、教育程度、愛好等。
參考:為什么Spark中只有ALS 高度易并行化的——它的每個子任務之間沒有什么依賴關系
顯式:
隱式:
在隱反饋模型中是沒有評分的,所以在式子中rui被pui所取代,pui是偏好的表示,僅僅表示用戶和物品之間有沒有交互,而不表示評分高低或者喜好程度。比如用戶和物品之間有交互就讓pui等于1,沒有就等于0。函數中還有一個cui的項,它用來表示用戶偏愛某個商品的置信程度,比如交互次數多的權重就會增加。
- 模型訓練好后,調用方法進行使用,為每個用戶推薦topn
- 召回到redis中
根據用戶對品牌偏好打分訓練ALS模型
模型存在HDFS上
# 將模型進行存儲 model.save("hdfs://localhost:9000/models/userBrandRatingModel.obj") # 測試存儲的模型 from pyspark.ml.recommendation import ALSModel # 從hdfs加載模型 my_model = ALSModel.load("hdfs://localhost:9000/models/userBrandRatingModel.obj") my_model # model.recommendForAllUsers(N) 給用戶推薦TOP-N個物品 my_model.recommendForAllUsers(3).first()三. CTR預估數據準備
分析并預處理raw_sample數據集
- 從HDFS中加載樣本數據信息
- 分析數據集字段的類型和格式
- 查看是否有空值
- 查看每列數據的類型
- 查看每列數據的類別情況
- 使用dataframe.withColumn更改df列數據結構;使用dataframe.withColumnRenamed更改列名稱
- 特征選取
只有廣告展示位pid對比較重要,且數據不同數據之間的占比約為6:4,因此pid可以作為一個關鍵特征
nonclk和clk在這里是作為目標值,不做為特征
- Spark中使用獨熱編碼
熱編碼只能對字符串類型的列數據進行處理
StringIndexer對指定字符串列數據進行特征處理,如將性別數據“男”、“女”轉化為0和1
OneHotEncoder對特征列數據,進行熱編碼,通常需結合StringIndexer一起使用
Pipeline讓數據按順序依次被處理,將前一次的處理結果作為下一次的輸入
【引申】用Embedding解決特征過多的問題:
如果特征過多,用獨熱編碼,將會造成大量稀疏向量。采用embedding轉成低維稠密向量,類似于word2vec的詞向量。
[Word2vec]
包括skip-gram(給出詞預測上下文)和CBOW(給出上下文預測詞)兩種訓練模式。Softmax層優化方法:①分層softmax:類似樹形分類器,每個節點都可以是一個二分類器。常用詞在頂部,類似哈夫曼樹。②負采樣:上下文詞和目標詞構成正樣本;用相同的上下文詞,再在字典找那個隨機選一個詞,標記為0.
[embedding]生成方法:①矩陣分解和因子分解機②利用word2vec方法③node2vec偽交互行為方法
- 訓練樣本和測試樣本
本樣本數據集共計8天數據
前七天為訓練數據、最后一天為測試數據
訓練樣本個數:
23249291
測試樣本個數:
3308670
分析并預處理ad_feature數據集(空值NULL->-1)
- HDFS中加載廣告基本信息
- 查看各項數據的特征
- 特征選擇
只選取price作為特征數據,因為價格本身是一個統計類型連續數值型數據,且能很好的體現廣告的價值屬性特征,通常也不需要做其他處理(離散化、歸一化、標準化等),所以這里直接將當做特征數據來使用
分析并預處理user_profile數據集(null)——隨機森林——困難
# 注意:這里的null會直接被pyspark識別為None數據,也就是na數據,所以這里可以直接利用schema導入數據- 缺失值處理
-
注意,一般情況下:
- 缺失率低于10%:可直接進行相應的填充,如默認值、均值、算法擬合等等;
- 高于10%:往往會考慮舍棄該特征
- 特征處理,如1維轉多維(也就是將缺失作為一個特征
但根據我們的經驗,我們的廣告推薦其實和用戶的消費水平、用戶所在城市等級都有比較大的關聯,因此在這里pvalue_level、new_user_class_level都是比較重要的特征,我們不考慮舍棄
-
缺失值處理方案:
- 填充方案:結合用戶的其他特征值,利用隨機森林算法進行預測;但產生了大量人為構建的數據,一定程度上增加了數據的噪音
- 把變量映射到高維空間(把缺失值當做單獨的一類處理):如pvalue_level的1維數據,轉換成是否1、是否2、是否3、是否缺失的4維數據;這樣保證了所有原始數據不變,同時能提高精確度,但這樣會導致數據變得比較稀疏,如果樣本量很小,反而會導致樣本效果較差,因此也不能濫用
- 利用隨機森林對缺失值預測
- 與非缺失數據進行拼接,完成缺失值預測
困難點:
利用隨機森林對new_user_class_level的缺失值進行預測
可以發現由于這兩個字段的缺失過多,所以預測出來的值已經大大失真,但如果缺失率在10%以下,這種方法是比較有效的一種
解決辦法:
低維轉高維方式
我們接下來采用將變量映射到高維空間的方法來處理數據,即將缺失項也當做一個單獨的特征來對待,保證數據的原始性
由于該思想正好和熱獨編碼實現方法一樣,因此這里直接使用熱獨編碼方式處理數據
- 用戶特征合并
VectorAssembler將多個數值列按順序匯總成一個向量列。
- 特征選取(9個)
- cms_segid: 97
- cms_group_id: 13
- final_gender_code: 2
- age_level: 7
- shopping_level: 3
- occupation: 2
-pvalue_level
-new_user_class_level
-price
四. LR實現CTR預估(12個特征)——改進
根據廣告點擊樣本數據集(raw_sample)、廣告基本特征數據集(ad_feature)、用戶基本信息數據集(user_profile)構建出了一個完整的樣本數據集,并按日期劃分為了訓練集(前七天)和測試集(最后一天),利用邏輯回歸進行訓練。
Dataframe數據合并:pyspark.sql.DataFrame.join
# raw_sample_df和ad_feature_df合并條件 condition = [raw_sample_df.adgroupId==ad_feature_df.adgroupId] _ = raw_sample_df.join(ad_feature_df, condition, 'outer')# _和user_profile_df合并條件 condition2 = [_.userId==user_profile_df.userId] datasets = _.join(user_profile_df, condition2, "outer") # 查看datasets的結構 datasets.printSchema() # 查看datasets條目數 print(datasets.count())按probability升序排列數據,probability表示預測結果的概率
如果預測值是0,其概率是0.9248,那么反之可推出1的可能性就是1-0.9248=0.0752,即點擊概率約為7.52%
因為前面提到廣告的點擊率一般都比較低,所以預測值通常都是0,因此通常需要反減得出點擊的概率
改進:進一步提升訓練精確度,將類別特征轉為多維特征,提高特征空間的維度,
類別性特征都可以考慮進行熱獨編碼,將單一變量變為多變量,相當于增加了相關特征的數量
五. 離線推薦數據緩存
這里主要是利用我們前面訓練的ALS模型進行協同過濾召回
如果是離線,為每個用戶召回排序的結果存在redis中,線上服務需求推薦時,在redis中調取出來;
優點:操作簡單 缺點:不重新算的話 數據庫中數據不變,實時性不好
如果是在線的話,獲取到用戶id,到數據庫中找到用戶特征,找到所有商品的特征,將用戶特征和商品特征送入邏輯回歸模型中計算點擊率,做排序
若用戶對于推薦的某物品 累計幾次都沒看 則將此物品從召回集中刪除,實時的影響到召回結果
若用戶近期對于某些物品點擊的多,也可以實時的更新用戶特征(例如消費檔次。。。
六. 實時產生推薦結果
CTR預測模型 + 特征 ==> 預測結果 ==> TOP-N列表
七、推薦算法
協同過濾(召回)
1.基于用戶的:為用戶推薦和他興趣相似的其他用戶喜歡的物品
(1)首先根據用戶對物品的打分情況,計算用戶與其他用戶的相似程度,找出最相似的n個用戶
(2)根據這n個用戶對此物品的評分情況以及用戶相似性程度可以得出用戶對物品的評分。如果評分較高,則推薦。
2.基于物品的:為用戶推薦和他之前喜歡的物品相似的物品
(1)計算物品之間的相似度。
(2)根據物品的相似度和用戶的歷史行為給用戶生成推薦列表。
3.計算兩個向量之間的相似程度
(1)杰卡德相似系數:兩個集合的交集占并集的比例
(2)余弦相似度:向量內積/向量2范數乘積
(3)皮爾遜相關系數:減平均值
4.應用場景
UserCF:適用于用戶少、物品多、時效性較強的場合(新聞推薦)
ItemCF: 適用于物品少、用戶多、用戶興趣固定的場合。
5.缺陷:
(1)泛化能力弱,熱門物品具有很強的頭部效應,容易跟大量物品產生相似,而尾部物品由于特征向量稀疏,導致很少被推薦;【矩陣分解技術,在協同過濾共現矩陣的基礎上,使用更稠密的隱向量表示用戶和物品,挖掘用戶和物品的隱含興趣和隱含特征,彌補協同過濾模型處理稀疏矩陣能力不足的問題。】
(2)僅利用了用戶與物品的交互信息,沒有利用到物品本身和用戶本身的屬性【以邏輯回歸模型為核心的推薦模型,引用了更多的特征】
矩陣分解(召回)
優點:由于隱向量的存在,使得任意的用戶和物品之間都可以得到預測分值,而求解隱向量的過程其實是對評分矩陣進行全局擬合的過程,這個過程中考慮了所有的用戶和評分,因此隱向量是利用全局信息生成的,有更強的泛化能力。
缺點:只用到了評分矩陣,沒有考慮到用戶特征、物品特征和上下文特征。【邏輯回歸模型以及因子分解機模型可以解決。】
LR+GBDT(排序)
FM、FFM
改進:用兩個特征的隱向量擬合w矩陣
②復雜度:直觀上看復雜度是O(kn^2),但可優化到O(kn)
③優點:可以解決稀疏性問題,向量本身可能非常稀疏,但是將其投影到隱向量空間,變成低維稠密向量。
缺點:交叉特征比較淺層(僅限于2階,再高不好實現),沒有深層的含義,所以改進用deepFM(wide&deep架構)
O(nfk),f是域的個數,O(kn^2)
Wide&deep
簡單的模型,例如協同過濾、邏輯回歸等,能夠從歷史數據中學習到高頻共現的特征組合,但是泛化能力不足;
而像矩陣分解,embedding再加上深度學習網絡,能夠探索歷史數據中未出現的特征組合,挖掘數據潛在的關聯模式,但對于某些特定的場景(數據分布長尾,大部分query-item都沒什么關系),會推薦過度泛化。結合在提高模型泛化能力的同時,兼顧模型的記憶性。
項目二: RNN步態認證
項目簡介
項目簡介:利用移動設備的內嵌傳感器采集用戶的步態信息,對當前用戶進行步態認證。
首先通過移動設備上的傳感器數據獲取APP,分別獲得用戶在不同的步態場景(走路、跑步、上下樓梯)以及不同的設備位置下的加速度計、陀螺儀、磁力計數據。
對數據進行清洗(缺失值處理、過濾異常值、去噪),步態周期分割。為了減少移動設備方向對數據的干擾,將傳感器數據進行坐標系的轉換(設備坐標系轉變到用戶坐標系)。
用tensorflow訓練LSTM和GRU步態認證模型(包括單層、雙向、多層),采用Mini- batch訓練法,使用Adam進行優化,采用Dropout技術防止過擬合。
繪制ROC曲線分析認證結果,認證EER為3.11%。
坐標系轉換
用戶坐標系:X軸指向上,Y軸為運動方向,Z軸為橫向。
X軸:重力過濾
Y軸:PCA降維,找到方差最大的方向
Z軸:與X軸和Y軸垂直
LSTM、GRU
LSTM:遺忘門、輸入門、輸出門、還包括細胞狀態
GRU:
更新門(類似于LSTM的遺忘門和輸入門)、重置門(控制需要保留多少之前的記憶),去除了細胞狀態,使用隱藏狀態進行信息的傳遞。
GRU
z:更新門 r:重置門
梯度消失、梯度爆炸
- 使用不同的激活函數:Relu大于0的部分導數為1,就不存在梯度消失爆炸問題了,每層網絡都可以得到相同的更新速度。但是,它負數部分恒為0,會導致一些神經元無法激活(可以通過設置小學習率部分解決),leakrelu解決了它負數部分為0
的問題。 激活函數:sigmoid,tanh,relu,leaekrelu - Batchnorm: 如何解決梯度問題:通過批規范化,解決分布問題,將輸出從飽和區拉到非飽和區。
原理:在輸入到激活函數之前,將特征進行歸一化,需要用λ和β(平移參數和縮放參數)進行調整,保證每一次數據經過歸一化后還保留之前學習來的特征,加快訓練速度。測試的時候,用的是訓練時候的平均值和方差。
為什么能加快訓練?每一次參數迭代更新后,上一層網絡的輸出數據經過這一層網絡計算后,數據的分布會發生變化,給下一層網絡的學習帶來困難,神經網絡本來就是要學習數據的分布,如果說分布一直變的話,就很難學習。
作用:減弱前層參數與后層參數之間的聯系,使得網絡的每層都可以自己學習,獨立于其他層,有助于加速網絡的學習;另一方面,有正則化的效果,類似于dropout,給隱藏層添加噪音,因為計算的是mini-batch上的均值和方差,而不是整個數據集的,這使得后面的隱藏單元不過分依賴任何一個隱藏單元。 - 梯度剪切、正則(針對梯度爆炸):剪切:設置一個閾值,當更新梯度時,如果梯度超過這個閾值,就將它強制限制在這個范圍內,可以防止梯度爆炸。正則:通過正則化項,可以部分限制梯度爆炸的發生。
梯度優化算法
(1)batch: 獲得全局最優解,對整個數據集計算梯度,計算慢
(2)SGD隨機梯度:每次更新時對每個樣本進行梯度更新,可能會跳到更好的局部最優解,但因此噪音較多,有嚴重振蕩。
(3)Mini-bacth:結合上兩個優點,減少參數更新的次數,達到更穩定收斂結果。
上述算法的缺點:
對所有參數更新時應用同樣的learning rate,如果數據是稀疏的,更希望對出現頻率低的特征進行大一點的更新。學習率可以隨著更新的次數變小;而且,一開始參數剛學習時,離最優解比較遠,需要一個較大的學習率,但后面需要小一點。對于非凸函數,容易陷入局部極小值,或鞍點。
凸函數:海森矩陣為半正定
(1)Adagrada:
根據歷史梯度值自適應的調節學習率,缺點:分母(歷史梯度平方和)會不斷累積,學習率就會收縮最終變得非常小。
(2)RMSprop:
對AdaGrad的改進,按照衰減系數累積歷史的梯度平方值
(3)Adam:
RMSprop(過去梯度平方的指數衰減平均值)+動量項(過去梯度的指數衰減平均值)
動量項:可以使得梯度方向不變的維度上速度變快,梯度方向有所改變的維度上更新速度變慢,這樣可以加快收斂并減小振蕩。
dropout防止過擬合
原理:在訓練過程中,對于神經網絡單元,按照一定的概率將其暫時從網絡中丟棄
為什么:相當于訓練了多個模型,類似集成學習,減弱神經元節點間的聯合適應性,增強泛化能力;另一個角度,相當于做了數據增強,每次隨機的丟棄一些單元,相當于增加了樣本。
測試階段不使用dropout,因為在測試階段進行預測時,不期望輸出結果是隨機的,否則預測會受到干擾。
數據:數據在抽樣時,可能并不能代表整體,甚至與整體有較大差異;
模型:模型過于復雜
- 數據:數據增強
圖像:縮放、翻轉、裁剪、顏色變換等 SMOTE算法(人工合成數據):通過將k個最近的鄰居合并形成新實例。
類別不均衡問題: 1.調整分類閾值; 2.選擇合適的評估指標; 3.使用集成學習模型; 4.損失函數加權的方法:給少數類的權重更高,使得分錯少數類的代價更高,從而才追求整體代價最小的目標下,學習器就會偏向于盡可能將少數類劃分正確。 - 模型:①簡化:減少網絡的層數,神經元個數;②訓練時間:early stopping;③正則化;④模型集成的方法。
正則化:λ大,容易欠擬合
1.為什么可以防止過擬合:
擬合過程中傾向于讓權值盡可能小,可以設想一下對于一個線性回歸方程,若參數很大,數據偏移一點,就會對結果造成很大的影響;但參數足夠小,不會對結果造成大的影響。
2.區別:
l1是權重向量的絕對值,l2是平方和;l1可以使權重稀疏,來使權重平滑。
3.為什么l1容易得到稀疏解:
①角度一:l1相當于為參數定義了一個菱形的解空間,來相當于定義一個圓形,l1的棱角更容易與目標函數等高線碰撞,從而產生稀疏解。
②角度二:對L1和L2正則化下的目標函數求導。?
評價指標
- 橫坐標:FPR(假正率),預測為正但實際為負的樣本占所有負例樣本的比例;
縱坐標:TPR(真正率),預測為正且實際為正的樣本占所有正例樣本的比例。 - 繪制:假設已經得到了所有樣本的概率輸出(屬于正樣本的概率),根據每個測試樣本屬于正樣本的概率值從大到小排列,依次將這些概率值作為閾值,當測試樣本屬于正樣本的概率大于或等于這個閾值時,認為是正樣本,否則為負樣本。每個閾值可以得到一組FPR,TPR。
- AUC物理意義:模型將某個隨機正類樣本排列在某個隨機負類樣本之上的概率。
- ROC特性:當測試集中的正負樣本分布變化的時候,ROC曲線能夠保持不變。而Precision-recall會變。
為什么可以避免樣本不平衡問題?舉例:總樣本中,90%是正樣本,10%是負樣本。TPR只關注90%正樣本中有多少是被真正覆蓋的,而與那10%無關;FPR只關注10%負樣本中有多少是被錯誤覆蓋的,也與那90%無關。
準確率 對于類別不平衡情況,沒有參考意義。
precision、recall、f1-score
Precision: 預測的正例中,實際為正例的比例
Recall:真實的正例中,實際被預測出來的比例,”寧可錯殺一千,絕不放過一個
F1-score = 2×precision*recall/(precision+recall)
PR曲線:橫軸:Recall,縱軸:Precision
機器學習基礎
1. 邏輯回歸
回歸模型:
1 線性回歸:自變量和因變量必須滿足線性關系
2 套索回歸:線性回歸+L1正則,有助于特征選擇
3 嶺回歸:線性回歸+L2正則
LR 邏輯回歸 分類
①原理:假設數據服從伯努利分布(拋硬幣),在線性回歸的基礎上加了一個sigmoid函數(非線性映射),通過極大似然函數的方法,運用梯度下降求解參數,達到將數據二分類的目的。
②優點:簡單、占內存小、便于并行。
- 并行化:對目標函數梯度計算的并行化。由于目標函數的梯度向量計算中只需要進行向量間的點乘和相加,可以很容易將每個迭代過程拆分成相互獨立的計算步驟,由不同的節點進行獨立計算,然后歸并計算結果。
最大似然估計:在已知分布產生的一些樣本,?不知道具體參數的情況下根據樣本值推斷最有可能產生樣本的參數值。
缺點:需要手動交叉特征;處理非線性問題麻煩,需離散化。
【為什么要特征交叉,特征切分:舉例辛普森悖論:在某個條件下的兩組數據,分別討論時都會滿足某種性質,可是一旦合并考慮,卻可能導致相反的結論。】
為什么不用平方損失函數:
①若用,會發現梯度的更新速度和sigmoid函數本身的梯度相關,而sigmoid函數在它定義域內的梯度都不大于0.25,訓練會非常慢
②會使得損失函數不是凸優化的。
- 為什么要將高度相關的特征去掉?
①可以使模型的可解釋性更好。②提高訓練速度。
似然函數:
損失函數:
梯度更新:
2. 決策樹
決策樹
C4.5——最大信息增益比=最大信息增益/數據集關于某個特征的取值熵,對取值較多的特征進行懲罰
CART——最大基尼指數,是一顆二叉樹,采用二元切割法,每一步將數據按特征A的取值切成兩份。
(1)ID3只能處理離散型變量,而C4.5和CART都可以處理連續變量
(2)ID3和C4.5只能用于分類任務,而CART可以用于分類和回歸
(3)ID3對樣本特征缺失值比較敏感,而C4.5和CART可以對缺失值進行不同方式的處理。
3. 支持向量機
支持向量機
- 原理:最大化幾何間隔,轉為求解對偶問題(更容易求解;自然引入核函數,進而推廣到非線性分類問題)。
②幾何間隔:函數間隔/w的二范數。表示實例點到超平面帶符號的距離。
- 優點: 對異常值不敏感。計算的復雜性取決于支持向量的數目,而不是樣本空間的維數,這在某種意義上避免了“維數災難”。
- 缺點:對大規模訓練樣本難以實施;解決多分類問題困難;對參數和核函數選擇敏感
4. 集成學習
集成學習
?差反映的是模型每?次輸出結果與模型輸出期望之間的誤差,即模型的穩定性。
①樣本選擇:bagging有放回的選取;boosting每一輪訓練集不變,只是權重發生變化;
②bagging所有弱分類器權重一樣;boosting對于分類誤差小的分類器有更大的權重;
③bagging各弱分類器可以并行生成,boosting只能順序。
5.隨機森林
隨機森林
(1)從原始樣本中有放回抽樣的選取n個樣本;
(2)對n個樣本選取,隨機選取k個特征,用建立決策樹的方法獲得最佳分割點
(3)重復多次,建立多個決策樹 (4)多數投票機制決定最終結果
①如果不放回,每棵樹的樣本完全不同,基學習器之間的相似性小,模型偏差大;
②如果不抽樣,使用全部樣本訓練,模型的方差大,泛化能力差。
③可以產生一部分袋外樣本,做袋外估計。
- 優點:
- 缺點:
6. GBDT
GBDT
原理:只能用回歸樹。每一顆樹學的是之前所有樹結論和的殘差,用損失函數的負梯度來擬合本輪損失的近似值。無論是分類問題還是回歸問題,都可通過其損失函數的負梯度擬合,區別僅在于損失函數不同導致的負梯度不同。
缺點:由于弱學習器之間的依賴關系,難以并行訓練數據。
7. XGB、LGB
XGBoost
相較于GBDT的優點:
LightGBM
相較于xgboost
- XGBoost 使用預排序后需要記錄特征值及其對應樣本的統計值的索引,而 LightGBM 使用了直方圖算法將特征值轉變為 bin 值,且不需要記錄特征到樣本的索引,將空間復雜度從 O(2*#data) 降低為 O(#bin) ,極大的減少了內存消耗;
- LightGBM采用了直方圖算法將存儲特征值轉變為存儲 bin 值,降低了內存消耗; LightGBM
在訓練過程中采用互斥特征捆綁算法減少了特征數量,降低了內存消耗。
- LightGBM 采用了直方圖算法將遍歷樣本轉變為遍歷直方圖,極大的降低了時間復雜度;
- LightGBM在訓練過程中采用單邊梯度算法過濾掉梯度小的樣本,減少了大量的計算;
- LightGBM 采用了基于 Leaf-wise算法的增長策略構建樹,減少了很多不必要的計算量;
- LightGBM采用優化后的特征并行、數據并行方法加速計算,當數據量非常大的時候還可以采用投票并行的策略;
- LightGBM 對緩存也進行了優化,增加了 Cache hit 的命中率。
8. Adaboost
Adaboost
①初始化樣本集權重
②得到弱分類器
③計算樣本分類誤差
④計算弱分類器數
⑤更新樣本集的權重分布
⑥構成最終的分類器
①初始化樣本集權重
②得到弱分類器
③計算訓練集上的最大誤差
④計算每個樣本的相對誤差
⑤計算回歸誤差率
⑥計算弱學習器的系數
⑦更新樣本集的權重分布
⑧構成最終分類器
缺點:對異常樣本敏感,異常樣本在迭代中可能會獲得較高的權重,影響最終學習器的預測準確性。
總結
- 上一篇: Java程序员如何写简历,给大家一个小建
- 下一篇: 微信WiFi认证的解决方案