假期过后,你的元气值恢复了多少?(一)
? ???作者:livan
? ? ?來源:數據python戰算法
隨著工作年限的增長,這一感覺似乎越來越明顯,似乎一周七天里面最累的是周一——黑眼圈、惺忪眼、哈氣連天,不自覺會想起曾經那個三天網吧,三天課堂的少年。
那么,如何才能預測出一個人的工作恢復能力呢?筆者借著小伙伴的調研,做了簡單的探索。有興趣的小伙伴可以簡單試一下,剛好也借這個機會梳理一下常用的機器學習的常用算法,畢竟這個研究的過程,幾乎嘗試了常見的機器學習算法。
文章的緣起是一個心理學問題,希望能從微博近幾個禮拜的數據中找尋到人類的情感波動,并輔以問卷調研的方法探索當下發微博的人的復工程度,由于數據的權限問題,這里只做技術性探討,后文也會附上代碼,如果有興趣,歡迎大家嘗試。
之前在《增長的旋律——AARRR模式思考(三)》文章中曾仔細分析過微博和微信的差異,作為一個線上的公共場所,微博無時無刻不承載著各種網絡言論,其中不乏對工作的安排、對生活的情緒,微博也便成為了線上反應各自情緒的數據來源。那么,通過對微博數據的挖掘,能否預測出真實生活中人的行為和狀態呢?作為一個數據人,總是希望能夠有機會一探究竟,下面我們一起走一遍研究的過程:
P1
數據收集
研究隨機圈定了一群經常使用微博的人,收集他們在微博上發表的博文,記錄他們的發表時間,發表地點,點贊和評論次數等相關信息,每周為一個單位,持續關注三到四個月的時間,以此來探索被試者的情緒波動,確定被試者在何種情緒下會發出什么樣的文字。
為了更全面的探索,研究增加了線下調研的部分,對這些經常使用微博的人進行有償問卷作答,從工作狀況、家庭狀況、收入以及睡眠等幾個方面設計問卷,并通過心理學的方法探索被試者在心理剝離、放松經驗、控制經驗等方面的得分,探索用分數的形式表現緊張、憤怒、精力、抑郁等多種情緒。
數據的收集結構如下圖:
通過上面的兩種思路,我們收集到了一整套完整的數據,涵蓋了文本、字符串和數字,經過匯總整理后,我們得到如下表格:
(1)線下調研部分數據樣式為:
(2)微博部分數據樣式為:
P2
數據處理
觀察上面的數據,我們會發現,數據的樣式比較多樣,有文本形式,有時間值,有數值得分也有字符串等,需要進行較為詳細的特征工程,在建模的時候花費大量時間的往往就在這里了:離散值怎么向量化?文本怎么提取語義?怎么做降維處理?怎么歸一化?基本步驟都會圍繞這些問題進行,對于離散化、歸一化和降維處理都是一些常規的做法,在sklearn中會有一些完整的函數:
1)離散化等one-hot處理:
這一處理方法主要應用在特征獨立性要求不強的模型中,因為one-hot是將一個特征以向量的方式呈現成多列,這些擴展開的列存在一定的相關性,如果對于特征獨立性要求高的模型可以嘗試使用WOE計算方法,將各個無法計算的特征(【山東、上海、……】)轉化成可以計算的數字。
另外為了便于分類,也會存在將連續的數字拆分成幾個離散的值,比如將【1,2,3,4,5,6,7,8,9】等連續值拆分成兩類【0,1】,這樣的方法往往會用統計學中的一些分箱方法,進行等頻分箱或者等額分箱等。
2)降維處理:
降維處理在建模過程中算是必備的一個步驟,經過離散化處理之后,數據特征有可能已經達到1000甚至10000維度,這一數據量直接投放到模型中往往會引發維度爆炸、維度災難,那如何降維呢?最常用的方法主要有兩個:一般機器學習的模型會比較常用主成分分析,神經網絡深度學習部分主要是embedding方法,這些方法在降維的效果上不僅能夠有效減少維度,更重要的他們能夠減少各個特征中大量為零的狀態,使模型的訓練能更加高效精準。
這兩種方法分別在兩個包里:
主成分分析在sklearn中的函數為:
estimator = PCA(n_components=num) pca_X_train = estimator.fit_transform(X_train4) pca_X_test = estimator.fit_transform(X_test4) pre_test_Y = y_test[['y_mean']] pca_train_Y = y_train['y_mean'].tolist()embedding在keras中的函數為:
model = Sequential() model.add(Embedding(5000, 512,input_length=100))講到embedding不妨多說一句,在深度學習中,embedding、word2vec、dropout、attention被稱作是必備組件,可見embedding的地位。
3)特征歸一化:
經歷過離散化、降維處理之后,有沒有發現我們的特征有大有小,來自于各個方向的數據往往存在不同的量綱,直接投放到模型中會存在量級上的差異,千萬級別的數據會輕而易舉的抹殺掉個位數的特征,導致量級小的特征特性不明顯,因此需要進行歸一化處理。歸一化主要是為了取消掉各個特征之間的量綱,使各個特征統一在一個維度使用。
歸一化在sklearn中的函數為:
from sklearn import preprocessing import numpy as np X = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]]) X_scaled = preprocessing.scale(X)歸一化的方法除了我們常用的z-score標準化之外,還有min-max標準化,改進的z-score標準化等方法,使用過程中可以根據需要選擇相應的方法。
上面的三個處理方法往往是我們建模過程中的標準套路,幾乎可以不假思索的應用于所有的特征工程,看到這里的你有沒有不解渴的感覺,費這么大功夫寫一篇文章,難道連一點特產也沒有嗎?當然不是,這個模型構建的特色在于對文本的處理,也就是下面我們重點講的東西:
文本的處理往往是獨立于數據挖掘的另外一個領域——NLP,這一領域相對獨立但又與模型有千絲萬縷的聯系,我們來看一下本文中的案例使用了什么獨特的方法:
本文采用的方法主要是采用關鍵詞處理的方法,根據博文進行詞性分析,根據詞性計算各個詞片段的得分,進而得出各個關鍵詞的權重分。個人以為,這也是這個研究中比較有特色的一個文本處理方法,不同于我們經常使用的TF-IDF、LDA、HMM隱馬、CRF條件隨機場等NLP模型。我們來仔細了解一下這一方法:
1)梳理關鍵詞:整理出我們比較關注的關鍵詞,添加到特征工程中,作為特征值,并同時篩選程度詞和否定詞,作為計算權重的依據;
2)切分詞短句:按照微博號匯總每個被試者發表的博文,并將博文按照“,”,“。”等標點符號拆分成一個個的短句,此時每個被試者的博文就會成為一個個帶有一定語義的詞短句,我們接下來就是要通過對這些短句進行處理,來判斷第一步中各個關鍵詞的權重,并作為特征值將其融入到特征工程中。
3)統計關鍵詞詞頻:遍歷每一個詞短句,統計其中關鍵詞的頻數,如果當下詞短句有對應的關鍵詞則記錄詞頻數l1,如果沒有對應的關鍵詞,則記為0。
4)計算程度詞權重:不同的程度詞權重系數不同,比如:“百分之百”、“倍加”等記為2,“多么”、“格外”等記為1.75,“大不了”、“更加”等記為1.5,“多多少少”、“還”等記為0.5,如果沒有程度詞,則記為1,這樣的詞匯可以區分出每個被試者在博文中的情緒強弱,并以數字的形式表現出來。
5)計算否定詞權重:如果詞短句中出現“沒有”、“未必”等詞語時可以根據需要標記成-1或者-0.5,沒有否定詞則記為1,通過這個方法來減少詞短句的權重。
6)計算關鍵詞權重:基于上面的計算我們將關鍵詞、程度詞和否定詞匯總在一起,形成我們對應關鍵詞的權重值:
關鍵詞權重=關鍵詞詞頻+程度詞權重*否定詞權重
上文中各個詞性的詞語可以按照項目的需要進行相應的調整,沒有統一的規則說是哪些詞一定在哪個項下,也沒有統一的規則確定每個詞性的權重值,具體的數值還是需要在應用的場景中仔細琢磨。
經過上面的描述,各位看官是否對這一特征工程方法有了深入的了解呢?學習的要義在不斷的實踐,大家有興趣的話可以基于上面的邏輯進行一些實踐,預測一下你的元氣值恢復了多少?
理論的描述總是淺顯的,下一篇文章中我們將深入探索一下這個方法在案例中的應用,歡迎大家繼續閱讀。
◆?◆?◆ ?◆?◆
長按二維碼關注我們
數據森麟公眾號的交流群已經建立,許多小伙伴已經加入其中,感謝大家的支持。大家可以在群里交流關于數據分析&數據挖掘的相關內容,還沒有加入的小伙伴可以掃描下方管理員二維碼,進群前一定要關注公眾號奧,關注后讓管理員幫忙拉進群,期待大家的加入。
管理員二維碼:
猜你喜歡
●?笑死人不償命的知乎沙雕問題排行榜
●?用Python扒出B站那些“驚為天人”的阿婆主!
●?全球股市跳水大戰,誰最坑爹!
●?上萬條數據撕開微博熱搜的真相!
●?你相信逛B站也能學編程嗎
總結
以上是生活随笔為你收集整理的假期过后,你的元气值恢复了多少?(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: [转]电影有时候不仅仅是娱乐,哈佛商学院
 - 下一篇: nodejs项目实例电商管理平台|销售系