机器学习
機器學(xué)習(xí)算法課程定位、目標(biāo)
定位
課程以算法、案例為驅(qū)動的學(xué)習(xí),伴隨淺顯易懂的數(shù)學(xué)知識
作為人工智能領(lǐng)域(數(shù)據(jù)挖掘/機器學(xué)習(xí)方向)的提升課程,掌握更深更有效的解決問題技能
目標(biāo)
應(yīng)用Scikit-learn實現(xiàn)數(shù)據(jù)集的特征工程
掌握機器學(xué)習(xí)常見算法原理
應(yīng)用Scikit-learn實現(xiàn)機器學(xué)習(xí)算法的應(yīng)用,結(jié)合場景解決實際問題
機器學(xué)習(xí)概述
了解機器學(xué)習(xí)定義以及應(yīng)用場景
什么是機器學(xué)習(xí)
1、 背景介紹
人工智能范圍
2、定義
機器學(xué)習(xí)是從數(shù)據(jù)中自動分析獲得規(guī)律(模型),并利用規(guī)律對未知數(shù)據(jù)進行預(yù)測
3、解釋
alphago
廣告推薦
機器學(xué)習(xí)定義
為什么需要機器學(xué)習(xí)
解放生產(chǎn)力:
智能客服:不知疲倦24小時小時作業(yè)
量化投資:避免更多的編寫策略、交易人員
醫(yī)療:幫助醫(yī)生輔助醫(yī)療
機器學(xué)習(xí)應(yīng)用場景
機器學(xué)習(xí)的應(yīng)用場景非常多,可以說滲透到了各個行業(yè)領(lǐng)域當(dāng)中。醫(yī)療、航空、教育、物流、電商等等領(lǐng)域的各種場景。
用在挖掘、預(yù)測領(lǐng)域:
應(yīng)用場景:店鋪銷量預(yù)測、量化投資、廣告推薦、企業(yè)客戶分類、SQL語句安全檢測分類…
傳統(tǒng)預(yù)測
量化投資
用在圖像領(lǐng)域:
應(yīng)用場景:街道交通標(biāo)志檢測、圖片商品識別檢測等等
用在自然語言處理領(lǐng)域:
應(yīng)用場景:文本分類、情感分析、自動聊天、文本檢測等等
當(dāng)前重要的是掌握一些機器學(xué)習(xí)算法等技巧,從某個業(yè)務(wù)領(lǐng)域切入解決問題。
學(xué)習(xí)框架和資料介紹
1、學(xué)習(xí)框架
框架
2、書籍資料
學(xué)習(xí)書籍
3、提深內(nèi)功(但不是必須)
深度學(xué)習(xí)
特征工程
了解特征工程在機器學(xué)習(xí)當(dāng)中的重要性
應(yīng)用sklearn實現(xiàn)特征預(yù)處理
應(yīng)用sklearn實現(xiàn)特征抽取
應(yīng)用sklearn實現(xiàn)特征選擇
應(yīng)用PCA實現(xiàn)特征的降維
說明機器學(xué)習(xí)算法監(jiān)督學(xué)習(xí)與無監(jiān)督學(xué)習(xí)的區(qū)別
說明監(jiān)督學(xué)習(xí)中的分類、回歸特點
說明機器學(xué)習(xí)算法目標(biāo)值的兩種數(shù)據(jù)類型
說明機器學(xué)習(xí)(數(shù)據(jù)挖掘)的開發(fā)流程
特征工程介紹
學(xué)習(xí)目標(biāo)
目標(biāo)
說出機器學(xué)習(xí)的訓(xùn)練數(shù)據(jù)集結(jié)構(gòu)組成
了解特征工程在機器學(xué)習(xí)當(dāng)中的重要性
知道特征工程的分類
應(yīng)用
無
1、什么是特征工程
特征工程是使用專業(yè)背景知識和技巧處理數(shù)據(jù),使得特征能在機器學(xué)習(xí)算法上發(fā)揮更好的作用的過程。
意義:會直接影響機器學(xué)習(xí)的效果
2、為什么需要特征工程(Feature Engineering)
機器學(xué)習(xí)領(lǐng)域的大神Andrew Ng(吳恩達(dá))老師說“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”
注:業(yè)界廣泛流傳:數(shù)據(jù)和特征決定了機器學(xué)習(xí)的上限,而模型和算法只是逼近這個上限而已。
我們從一個簡單的例子理解一下:
貓
貓2
問題:從歷史數(shù)據(jù)當(dāng)中獲得規(guī)律?這些歷史數(shù)據(jù)是怎么的格式?
3、數(shù)據(jù)集的構(gòu)成
3.1 可用數(shù)據(jù)集
可用數(shù)據(jù)集
Kaggle:https://www.kaggle.com/datasets
UCI:http://archive.ics.uci.edu/ml/index.php
3.2 數(shù)據(jù)集構(gòu)成
結(jié)構(gòu):特征值+目標(biāo)值
數(shù)據(jù)集結(jié)構(gòu)
注:有些數(shù)據(jù)集可以沒有目標(biāo)值,對于每一行數(shù)據(jù)我們可以稱之為樣本。
為什么需要這樣的結(jié)構(gòu)?后面結(jié)合機器學(xué)習(xí)算法去解釋
特征工程的位置與Pandas比較?
特征工程過程
pandas:一個數(shù)據(jù)讀取非常方便以及基本的處理格式的工具
sklearn:對于特征的處理提供了強大的接口
特征工程包含內(nèi)容
特征抽取
特征預(yù)處理
特征降維
4、特征工程所需工具
4.1Scikit-learn工具介紹
scikitlearn
Python語言的機器學(xué)習(xí)工具
Scikit-learn包括許多知名的機器學(xué)習(xí)算法的實現(xiàn)
Scikit-learn文檔完善,容易上手,豐富的API
目前穩(wěn)定版本0.18
4.2 安裝
pip3 install Scikit-learn==0.18
安裝好之后可以通過以下命令查看是否安裝成功
import sklearn
注:安裝scikit-learn需要Numpy,Pandas等庫
4.3 Scikit-learn包含的內(nèi)容
scikitlearn接口
分類、聚類、回歸
特征工程
模型選擇、調(diào)優(yōu)
特征提取
學(xué)習(xí)目標(biāo)
目標(biāo)
應(yīng)用DictVectorizer實現(xiàn)對類別特征進行數(shù)值化、離散化
應(yīng)用CountVectorizer實現(xiàn)對文本特征進行數(shù)值化
應(yīng)用TfidfVectorizer實現(xiàn)對文本特征進行數(shù)值化
說出兩種文本特征提取的方式區(qū)別
應(yīng)用
無
什么是特征提取呢?
文本特征提取圖
字典特征提取圖
演示案例:特征提取例子演示
1、特征提取
1.1包括將任意數(shù)據(jù)(如文本或圖像)轉(zhuǎn)換為可用于機器學(xué)習(xí)的數(shù)字特征
注:特征值化是為了計算機更好的去理解數(shù)據(jù)
字典特征提取(特征離散化)
文本特征提取
圖像特征提取(深度學(xué)習(xí)將介紹)
1.2 特征提取API
sklearn.feature_extraction
2、字典特征提取
作用:對字典數(shù)據(jù)進行特征值化
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩陣
DictVectorizer.inverse_transform(X) X:array數(shù)組或者sparse矩陣 返回值:轉(zhuǎn)換之前數(shù)據(jù)格式
DictVectorizer.get_feature_names() 返回類別名稱
2.1應(yīng)用
我們對以下數(shù)據(jù)進行特征提取
[{‘city’: ‘北京’,‘temperature’:100}
{‘city’: ‘上海’,‘temperature’:60}
{‘city’: ‘深圳’,‘temperature’:30}]
dictvec結(jié)果
2.2流程分析
實例化類DictVectorizer
調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換(注意返回格式)
def dict_vec():
注意觀察沒有加上sparse=False參數(shù)的結(jié)果
sparse矩陣
這個結(jié)果并不是我們想要看到的,所以加上參數(shù),得到想要的結(jié)果
我們會議之前在做pandas的離散化時候,也實現(xiàn)了類似的效果,那在這里我們把這個處理數(shù)據(jù)的技巧用專業(yè)的稱呼"one-hot"編碼,之前我們也解釋過為什么需要這種離散化的了,是分析數(shù)據(jù)的一種手段。比如下面例子:
onehot
onehot1
2.3 總結(jié)
對于特征當(dāng)中存在類別信息的我們都會做one-hot編碼處理
3、文本特征提取
作用:對文本數(shù)據(jù)進行特征值化
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
返回詞頻矩陣
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代對象 返回值:返回sparse矩陣
CountVectorizer.inverse_transform(X) X:array數(shù)組或者sparse矩陣 返回值:轉(zhuǎn)換之前數(shù)據(jù)格
CountVectorizer.get_feature_names() 返回值:單詞列表
sklearn.feature_extraction.text.TfidfVectorizer
3.1應(yīng)用
我們對以下數(shù)據(jù)進行特征提取
[“l(fā)ife is short,i like python”,
“l(fā)ife is too long,i dislike python”]
countvec結(jié)果
3.2 流程分析
實例化類CountVectorizer
調(diào)用fit_transform方法輸入數(shù)據(jù)并轉(zhuǎn)換 (注意返回格式,利用toarray()進行sparse矩陣轉(zhuǎn)換array數(shù)組)
def countvec():
問題:如果我們將數(shù)據(jù)替換成中文?
“人生苦短,我喜歡Python” “生活太長久,我不喜歡Python”
那么最終得到的結(jié)果是
不支持單個中文字
為什么會得到這樣的結(jié)果呢,仔細(xì)分析之后會發(fā)現(xiàn)英文默認(rèn)是以空格分開的。其實就達(dá)到了一個分詞的效果,所以我們要對中文進行分詞處理
3.3jieba分詞處理
jieba.cut()
返回詞語組成的生成器
需要安裝下jieba庫
pip3 install jieba
3.4 案例分析
對以下三句話進行特征值化
今天很殘酷,明天更殘酷,后天很美好,
但絕對大部分是死在明天晚上,所以每個人不要放棄今天。
我們看到的從很遠(yuǎn)星系來的光是在幾百萬年之前發(fā)出的,
這樣當(dāng)我們看到宇宙時,我們是在看它的過去。
如果只用一種方式了解某樣事物,你就不會真正了解它。
了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。
分析
準(zhǔn)備句子,利用jieba.cut進行分詞
實例化CountVectorizer
將分詞結(jié)果變成字符串當(dāng)作fit_transform的輸入值
三段中文結(jié)果
def cutword():
# 將三個句子用jieba.cut處理 contetn1 = jieba.cut("今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。") contetn2 = jieba.cut("我們看到的從很遠(yuǎn)星系來的光是在幾百萬年之前發(fā)出的,這樣當(dāng)我們看到宇宙時,我們是在看它的過去。") contetn3 = jieba.cut("如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯(lián)系。")# 先將著三個轉(zhuǎn)換成列表 c1 = ' '.join(list(contetn1)) c2 = ' '.join(list(contetn2)) c3 = ' '.join(list(contetn3))return c1, c2, c3def chvec():
# 實例化conunt count = CountVectorizer(stop_words=['不要', '我們', '所以'])# 定義一個分詞的函數(shù) c1, c2, c3 = cutword()data = count.fit_transform([c1, c2, c3])# 內(nèi)容 print(count.get_feature_names()) print(data.toarray())return None請看問題:
詞語占比
該如何處理某個詞或短語在多篇文章中出現(xiàn)的次數(shù)高這種情況
3.5 Tf-idf文本特征提取
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現(xiàn)的概率高,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或者短語具有很好的類別區(qū)分能力,適合用來分類。
TF-IDF作用:用以評估一字詞對于一個文件集或一個語料庫中的其中一份文件的重要程度。
3.5.1 公式
詞頻(term frequency,tf)指的是某一個給定的詞語在該文件中出現(xiàn)的頻率
逆向文檔頻率(inverse document frequency,idf)是一個詞語普遍重要性的度量。某一特定詞語的idf,可以由總文件數(shù)目除以包含該詞語之文件的數(shù)目,再將得到的商取以10為底的對數(shù)得到
tfidf公式
最終得出結(jié)果可以理解為重要程度。
注:假如一篇文件的總詞語數(shù)是100個,而詞語"非常"出現(xiàn)了5次,那么"非常"一詞在該文件中的詞頻就是5/100=0.05。而計算文件頻率(IDF)的方法是以文件集的文件總數(shù),除以出現(xiàn)"非常"一詞的文件數(shù)。所以,如果"非常"一詞在1,000份文件出現(xiàn)過,而文件總數(shù)是10,000,000份的話,其逆向文件頻率就是lg(10,000,000 / 1,0000)=3。最后"非常"對于這篇文檔的tf-idf的分?jǐn)?shù)為0.05 * 3=0.15
3.5.2 案例
def tfidfvec():
3.6 Tf-idf的重要性
分類機器學(xué)習(xí)算法進行文章分類中前期數(shù)據(jù)處理方式
特征預(yù)處理
學(xué)習(xí)目標(biāo)
目標(biāo)
了解數(shù)值型數(shù)據(jù)、類別型數(shù)據(jù)特點
應(yīng)用MinMaxScaler實現(xiàn)對特征數(shù)據(jù)進行歸一化
應(yīng)用StandardScaler實現(xiàn)對特征數(shù)據(jù)進行標(biāo)準(zhǔn)化
應(yīng)用
無
什么是特征預(yù)處理?
特征預(yù)處理圖
1、什么是特征預(yù)處理
scikit-learn的解釋
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻譯過來:通過一些轉(zhuǎn)換函數(shù)將特征數(shù)據(jù)轉(zhuǎn)換成更加適合算法模型的特征數(shù)據(jù)過程
可以通過上面那張圖來理解
1.1 包含內(nèi)容
數(shù)值型數(shù)據(jù)的無量綱化:
歸一化
標(biāo)準(zhǔn)化
1.2 特征預(yù)處理API
sklearn.preprocessing
為什么我們要進行歸一化/標(biāo)準(zhǔn)化?
特征的單位或者大小相差較大,或者某特征的方差相比其他的特征要大出幾個數(shù)量級,容易影響(支配)目標(biāo)結(jié)果,使得一些算法無法學(xué)習(xí)到其它的特征
約會對象數(shù)據(jù)
約會對象數(shù)據(jù)
我們需要用到一些方法進行無量綱化,使不同規(guī)格的數(shù)據(jù)轉(zhuǎn)換到同一規(guī)格
2、歸一化
2.1定義
通過對原始數(shù)據(jù)進行變換把數(shù)據(jù)映射到(默認(rèn)為[0,1])之間
2.2公式
歸一化公式
作用于每一列,max為一列的最大值,min為一列的最小值,那么X’’為最終結(jié)果,mx,mi分別為指定區(qū)間值默認(rèn)mx為1,mi為0
那么怎么理解這個過程呢?我們通過一個例子
歸一化計算過程
2.3 API
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
MinMaxScalar.fit_transform(X)
X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
返回值:轉(zhuǎn)換后的形狀相同的array
2.4 數(shù)據(jù)計算
我們對以下數(shù)據(jù)進行運算,在dating.txt中。保存的就是之前的約會對象數(shù)據(jù)
milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
分析
1、實例化MinMaxScalar
2、通過fit_transform轉(zhuǎn)換
def mm():
“”"
對二維數(shù)組進行歸一化處理
:return:
“”"
data = pd.read_csv("./data/datingtest/dating.txt")
問題:如果數(shù)據(jù)中異常點較多,會有什么影響?
異常點對歸一化影響
2.5 歸一化總結(jié)
注意最大值最小值是變化的,另外,最大值與最小值非常容易受異常點影響,所以這種方法魯棒性較差,只適合傳統(tǒng)精確小數(shù)據(jù)場景。
怎么辦?
3、標(biāo)準(zhǔn)化
3.1定義
通過對原始數(shù)據(jù)進行變換把數(shù)據(jù)變換到均值為0,標(biāo)準(zhǔn)差為1范圍內(nèi)
3.2 公式
標(biāo)準(zhǔn)化公式
作用于每一列,mean為平均值,σ為標(biāo)準(zhǔn)差
所以回到剛才異常點的地方,我們再來看看標(biāo)準(zhǔn)化
標(biāo)準(zhǔn)化異常點影響
對于歸一化來說:如果出現(xiàn)異常點,影響了最大值和最小值,那么結(jié)果顯然會發(fā)生改變
對于標(biāo)準(zhǔn)化來說:如果出現(xiàn)異常點,由于具有一定數(shù)據(jù)量,少量的異常點對于平均值的影響并不大,從而方差改變較小。
3.3 API
sklearn.preprocessing.StandardScaler( )
處理之后每列來說所有數(shù)據(jù)都聚集在均值0附近標(biāo)準(zhǔn)差差為1
StandardScaler.fit_transform(X)
X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
返回值:轉(zhuǎn)換后的形狀相同的array
3.4 數(shù)據(jù)計算
同樣對上面的數(shù)據(jù)進行處理
[[90,2,10,40],
[60,4,15,45],
[75,3,13,46]]
分析
1、實例化StandardScaler
2、通過fit_transform轉(zhuǎn)換
def std():
“”"
標(biāo)準(zhǔn)化處理
“”"
data = pd.read_csv("./data/datingtest/dating.txt")
3.5 標(biāo)準(zhǔn)化總結(jié)
在已有樣本足夠多的情況下比較穩(wěn)定,適合現(xiàn)代嘈雜大數(shù)據(jù)場景。
特征選擇
學(xué)習(xí)目標(biāo)
目標(biāo)
知道特征選擇的嵌入式、過濾式以及包裹氏三種方式
應(yīng)用VarianceThreshold實現(xiàn)刪除低方差特征
了解相關(guān)系數(shù)的特點和計算
應(yīng)用相關(guān)性系數(shù)實現(xiàn)特征選擇
應(yīng)用
無
在講什么是特征選擇之前,我們得先介紹一個降維的概念
1、降維
降維是指在某些限定條件下,降低隨機變量(特征)個數(shù),得到一組“不相關(guān)”主變量的過程
降低隨機變量的個數(shù)
降維
相關(guān)特征(correlated feature)
的相對濕度與降雨量之間的相關(guān)
等等
正是因為在進行訓(xùn)練的時候,我們都是使用特征進行學(xué)習(xí)。如果特征本身存在問題或者特征之間相關(guān)性較強,對于算法學(xué)習(xí)預(yù)測會影響較大
2、降維的兩種方式
特征選擇
主成分分析(可以理解一種特征提取的方式)
3、什么是特征選擇
3.1 定義
數(shù)據(jù)中包含冗余或無關(guān)變量(或稱特征、屬性、指標(biāo)等),旨在從原有特征中找出主要特征。
鳥類特征選擇
3.2 方法
Filter(過濾式):主要探究特征本身特點、特征與特征和目標(biāo)值之間關(guān)聯(lián)
方差選擇法:低方差特征過濾
相關(guān)系數(shù)
Embedded (嵌入式):算法自動選擇特征(特征與目標(biāo)值之間的關(guān)聯(lián))
決策樹:信息熵、信息增益
正則化:L1、L2
深度學(xué)習(xí):卷積等
Wrapper (包裹式)
對于Embedded方式,只能在講解算法的時候在進行介紹,更好的去理解
3.3 模塊
sklearn.feature_selection
4、過濾式
4.1低方差特征過濾
刪除低方差的一些特征,前面講過方差的意義。再結(jié)合方差的大小來考慮這個方式的角度。
特征方差小:某個特征大多樣本的值比較相近
特征方差大:某個特征很多樣本的值都有差別
4.1.1 API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
刪除所有低方差特征
Variance.fit_transform(X)
X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
返回值:訓(xùn)練集差異低于threshold的特征將被刪除。默認(rèn)值是保留所有非零方差特征,即刪除所有樣本中具有相同值的特征。
4.1.2 數(shù)據(jù)計算
我們對某些股票的指標(biāo)特征之間進行一個篩選,數(shù)據(jù)在"factor_regression_data/factor_returns.csv"文件當(dāng)中,除去’index,‘date’,'return’列不考慮(這些類型不匹配,也不是所需要指標(biāo))
一共這些特征
pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense
index,pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense,date,return
0,000001.XSHE,5.9572,1.1818,85252550922.0,0.8008,14.9403,1211444855670.0,2.01,20701401000.0,10882540000.0,2012-01-31,0.027657228229937388
1,000002.XSHE,7.0289,1.588,84113358168.0,1.6463,7.8656,300252061695.0,0.326,29308369223.2,23783476901.2,2012-01-31,0.08235182370820669
2,000008.XSHE,-262.7461,7.0003,517045520.0,-0.5678,-0.5943,770517752.56,-0.006,11679829.03,12030080.04,2012-01-31,0.09978900335112327
3,000060.XSHE,16.476,3.7146,19680455995.0,5.6036,14.617,28009159184.6,0.35,9189386877.65,7935542726.05,2012-01-31,0.12159482758620697
4,000069.XSHE,12.5878,2.5616,41727214853.0,2.8729,10.9097,81247380359.0,0.271,8951453490.28,7091397989.13,2012-01-31,-0.0026808154146886697
分析
1、初始化VarianceThreshold,指定閥值方差
2、調(diào)用fit_transform
def var():
“”"
刪除所有低方差特征
:return:
“”"
data = pd.read_csv("./data/factor_regression_data/factor_returns.csv")
4.2 相關(guān)系數(shù)
皮爾遜相關(guān)系數(shù)(Pearson Correlation Coefficient)
反映變量之間相關(guān)關(guān)系密切程度的統(tǒng)計指標(biāo)
4.2.2 公式計算案例(了解,不用記憶)
公式
相關(guān)系數(shù)公式
比如說我們計算年廣告費投入與月均銷售額
廣告費表
那么之間的相關(guān)系數(shù)怎么計算
廣告費統(tǒng)計系數(shù)結(jié)果
最終計算:
相關(guān)系數(shù)計算數(shù)字結(jié)果
= 0.9942
所以我們最終得出結(jié)論是廣告投入費與月平均銷售額之間有高度的正相關(guān)關(guān)系。
4.2.2 特點
相關(guān)系數(shù)的值介于–1與+1之間,即–1≤ r ≤+1。其性質(zhì)如下:
當(dāng)r>0時,表示兩變量正相關(guān),r<0時,兩變量為負(fù)相關(guān)
當(dāng)|r|=1時,表示兩變量為完全相關(guān),當(dāng)r=0時,表示兩變量間無相關(guān)關(guān)系
當(dāng)0<|r|<1時,表示兩變量存在一定程度的相關(guān)。且|r|越接近1,兩變量間線性關(guān)系越密切;|r|越接近于0,表示兩變量的線性相關(guān)越弱
一般可按三級劃分:|r|<0.4為低度相關(guān);0.4≤|r|<0.7為顯著性相關(guān);0.7≤|r|<1為高度線性相關(guān)
這個符號:|r|為r的絕對值, |-5| = 5
4.2.2 API
from scipy.stats import pearsonr
x : (N,) array_like
y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
4.3、 案例:股票的財務(wù)指標(biāo)相關(guān)性計算
我們剛才的股票的這些指標(biāo)進行相關(guān)性計算, 假設(shè)我們以
factor = [‘pe_ratio’,‘pb_ratio’,‘market_cap’,‘return_on_asset_net_profit’,‘du_return_on_equity’,‘ev’,‘earnings_per_share’,‘revenue’,‘total_expense’]
這些特征當(dāng)中的兩兩進行計算,得出相關(guān)性高的一些特征
指標(biāo)相關(guān)性結(jié)果
分析
兩兩特征之間進行相關(guān)性計算
data = pd.read_csv("./data/factor_regression_data/factor_returns.csv")
for i in range(len(factor)):
for j in range(i, len(factor)-1):
print(“指標(biāo)%s與指標(biāo)%s之間的相關(guān)性大小為%f” % (factor[i], factor[j+1], pearsonr(data[factor[i]], data[factor[j+1]])[0]))
從中我們得出
指標(biāo)revenue與指標(biāo)total_expense之間的相關(guān)性大小為0.995845
指標(biāo)return_on_asset_net_profit與指標(biāo)du_return_on_equity之間的相關(guān)性大小為0.818697
我們也可以通過畫圖來觀察結(jié)果
import matplotlib.pyplot as plt
plt.scatter(data[‘revenue’], data[‘total_expense’])
plt.show()
這兩對指標(biāo)之間的相關(guān)性較大,可以做之后的處理,比如合成這兩個指標(biāo)。
主成分分析
學(xué)習(xí)目標(biāo)
目標(biāo)
應(yīng)用PCA實現(xiàn)特征的降維
應(yīng)用
用戶與物品類別之間主成分分析
1、什么是主成分分析(PCA)
定義:高維數(shù)據(jù)轉(zhuǎn)化為低維數(shù)據(jù)的過程,在此過程中可能會舍棄原有數(shù)據(jù)、創(chuàng)造新的變量
作用:是數(shù)據(jù)維數(shù)壓縮,盡可能降低原數(shù)據(jù)的維數(shù)(復(fù)雜度),損失少量信息。
應(yīng)用:回歸分析或者聚類分析當(dāng)中
對于信息一詞,在決策樹中會進行介紹
那么更好的理解這個過程呢?我們來看一張圖
PCA解釋圖
1.1 計算案例理解(了解,無需記憶)
假設(shè)對于給定5個點,數(shù)據(jù)如下
(-1,-2)
(-1, 0)
( 0, 0)
( 2, 1)
( 0, 1)
PCA計算圖
要求:將這個二維的數(shù)據(jù)簡化成一維? 并且損失少量的信息
PCA坐標(biāo)軸結(jié)果
這個過程如何計算的呢?找到一個合適的直線,通過一個矩陣運算得出主成分分析的結(jié)果(不需要理解)
PCA運算過程
1.2 API
sklearn.decomposition.PCA(n_components=None)
將數(shù)據(jù)分解為較低維數(shù)空間
n_components:
小數(shù):表示保留百分之多少的信息
整數(shù):減少到多少特征
PCA.fit_transform(X) X:numpy array格式的數(shù)據(jù)[n_samples,n_features]
返回值:轉(zhuǎn)換后指定維度的array
1.3 數(shù)據(jù)計算
先拿個簡單的數(shù)據(jù)計算一下
[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]
def pca():
“”"
主成分分析進行降維
:return:
“”"
pca = PCA(n_components=0.7)
2、案例:探究用戶對物品類別的喜好細(xì)分降維
instacart
數(shù)據(jù)如下:
order_products__prior.csv:訂單與商品信息
字段:order_id, product_id, add_to_cart_order, reordered
products.csv:商品信息
字段:product_id, product_name, aisle_id, department_id
orders.csv:用戶的訂單信息
字段:order_id,user_id,eval_set,order_number,….
aisles.csv:商品所屬具體物品類別
字段: aisle_id, aisle
2.1 需求
instacart效果
instacartPCA結(jié)果
2.2 分析
合并表,使得user_id與aisle在一張表當(dāng)中
進行交叉表變換
進行降維
2.3 完整代碼
去讀四張表的數(shù)據(jù)
prior = pd.read_csv("./data/instacart/order_products__prior.csv")
products = pd.read_csv("./data/instacart/products.csv")
orders = pd.read_csv("./data/instacart/orders.csv")
aisles = pd.read_csv("./data/instacart/aisles.csv")
合并四張表
mt = pd.merge(prior, products, on=[‘product_id’, ‘product_id’])
mt1 = pd.merge(mt, orders, on=[‘order_id’, ‘order_id’])
mt2 = pd.merge(mt1, aisles, on=[‘a(chǎn)isle_id’, ‘a(chǎn)isle_id’])
pd.crosstab 統(tǒng)計用戶與物品之間的次數(shù)關(guān)系(統(tǒng)計次數(shù))
cross = pd.crosstab(mt2[‘user_id’], mt2[‘a(chǎn)isle’])
PCA進行主成分分析
pc = PCA(n_components=0.95)
data = pc.fit_transform(cross)
機器學(xué)習(xí)算法簡介
學(xué)習(xí)目標(biāo)
目標(biāo)
說明機器學(xué)習(xí)算法監(jiān)督學(xué)習(xí)與無監(jiān)督學(xué)習(xí)的區(qū)別
說明機器學(xué)習(xí)算法目標(biāo)值的兩種數(shù)據(jù)類型
說明監(jiān)督學(xué)習(xí)中的分類、回歸特點
說明機器學(xué)習(xí)(數(shù)據(jù)挖掘)的開發(fā)流程
應(yīng)用
無
1、機器學(xué)習(xí)算法類別
1.1 按照學(xué)習(xí)方式分類
監(jiān)督學(xué)習(xí)(supervised learning)(預(yù)測)
定義:輸入數(shù)據(jù)是由輸入特征值和目標(biāo)值所組成。函數(shù)的輸出可以是一個連續(xù)的值(稱為回歸),或是輸出是有限個離散值(稱作分類)。
分類 k-近鄰算法、貝葉斯分類、決策樹與隨機森林、邏輯回歸、神經(jīng)網(wǎng)絡(luò)
回歸 線性回歸、嶺回歸
標(biāo)注 隱馬爾可夫模型 (不做要求)
無監(jiān)督學(xué)習(xí)(unsupervised learning)
定義:輸入數(shù)據(jù)是由輸入特征值所組成。
聚類 k-means
半監(jiān)督和強化學(xué)習(xí)
1.2 區(qū)別
監(jiān)督學(xué)習(xí)無監(jiān)督學(xué)習(xí)區(qū)別
1.3 理解監(jiān)督無監(jiān)督
1.4 關(guān)于監(jiān)督學(xué)習(xí)中的分類與回歸區(qū)別
要理解這兩個概念,我們從兩個數(shù)據(jù)類別來看。
數(shù)據(jù)類別圖
1.4.1 兩種數(shù)據(jù)類型
離散型數(shù)據(jù):由記錄不同類別個體的數(shù)目所得到的數(shù)據(jù),又稱計數(shù)數(shù)據(jù),所有這些數(shù)據(jù)全部都是整數(shù),而且不能再細(xì)分,也不能進一步提高他們的精確度。
連續(xù)型數(shù)據(jù):變量可以在某個范圍內(nèi)取任一數(shù),即變量的取值可以是連續(xù)的,如,長度、時間、質(zhì)量值等,這類整數(shù)通常是非整數(shù),含有小數(shù)部分。
注:只要記住一點,離散型是區(qū)間內(nèi)不可分,連續(xù)型是區(qū)間內(nèi)可分
數(shù)據(jù)的類型將是機器學(xué)習(xí)中監(jiān)督學(xué)習(xí)不同問題不同處理的依據(jù)?
貓狗
票房預(yù)測
結(jié)合剛才講過的數(shù)據(jù)類型,針對這兩個例子的輸出結(jié)果,得出結(jié)論
分類:目標(biāo)值數(shù)據(jù)類型為離散型
分類是監(jiān)督學(xué)習(xí)的一個核心問題,在監(jiān)督學(xué)習(xí)中,當(dāng)輸出變量取有限個離散值時,預(yù)測問題變成為分類問題,最基礎(chǔ)的便是二分類問題,即判斷是非,從兩個類別中選擇一個作為預(yù)測結(jié)果;
回歸:目標(biāo)值數(shù)據(jù)類型為連續(xù)型
回歸是監(jiān)督學(xué)習(xí)的另一個重要問題?;貧w用于預(yù)測輸入變量和輸出變量之間的關(guān)系,輸出是連續(xù)型的值。
2、機器學(xué)習(xí)開發(fā)流程
開發(fā)流程
2.1 理解模型這個概念
指對于某個實際問題或客觀事物,應(yīng)用合適的算法得到的結(jié)果,稱之為模型。
相當(dāng)于對問題,抽象成數(shù)學(xué)問題。模型 = 算法 + 數(shù)據(jù)
分類算法
知道數(shù)據(jù)集的分為訓(xùn)練集和測試集
知道sklearn的轉(zhuǎn)換器和估計器流程
了解sklearn的分類、回歸數(shù)據(jù)集
說明K-近鄰算法的距離公式
說明K-近鄰算法的超參數(shù)K值以及取值問題
說明K-近鄰算法的優(yōu)缺點
應(yīng)用KNeighborsClassifier實現(xiàn)分類
了解分類算法的評估標(biāo)準(zhǔn)準(zhǔn)確率
說明樸素貝葉斯算法的原理
說明樸素貝葉斯算法的優(yōu)缺點
應(yīng)用MultinomialNB實現(xiàn)文本分類
應(yīng)用模型選擇與調(diào)優(yōu)
說明決策樹算法的原理
說明決策樹算法的優(yōu)缺點
應(yīng)用DecisionTreeClassifier實現(xiàn)分類
說明隨機森林算法的原理
說明隨機森林算法的優(yōu)缺點
應(yīng)用RandomForestClassifier實現(xiàn)分類
數(shù)據(jù)集介紹與劃分
學(xué)習(xí)目標(biāo)
目標(biāo)
知道數(shù)據(jù)集的分為訓(xùn)練集和測試集
知道sklearn的分類、回歸數(shù)據(jù)集
應(yīng)用
無
拿到的數(shù)據(jù)是否全部都用來訓(xùn)練一個模型?
1、 數(shù)據(jù)集的劃分
機器學(xué)習(xí)一般的數(shù)據(jù)集會劃分為兩個部分:
訓(xùn)練數(shù)據(jù):用于訓(xùn)練,構(gòu)建模型
測試數(shù)據(jù):在模型檢驗時使用,用于評估模型是否有效
劃分比例:
訓(xùn)練集:70% 80% 75%
測試集:30% 20% 30%
API
sklearn.model_selection.train_test_split(arrays, *options)
x 數(shù)據(jù)集的特征值
y 數(shù)據(jù)集的標(biāo)簽值
test_size 測試集的大小,一般為float
random_state 隨機數(shù)種子,不同的種子會造成不同的隨機采樣結(jié)果。相同的種子采樣結(jié)果相同。
return ,測試集特征訓(xùn)練集特征值值,訓(xùn)練標(biāo)簽,測試標(biāo)簽(默認(rèn)隨機取)
結(jié)合后面的數(shù)據(jù)集作介紹
2、sklearn數(shù)據(jù)集介紹
2.1分類和回歸數(shù)據(jù)集
分類數(shù)據(jù)集
分類數(shù)據(jù)集
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
subset: ‘train’或者’test’,‘a(chǎn)ll’,可選,選擇要加載的數(shù)據(jù)集.訓(xùn)練集的“訓(xùn)練”,測試集的“測試”,兩者的“全部”
回歸數(shù)據(jù)集
回歸數(shù)據(jù)集
2.2 API
sklearn.datasets
加載獲取流行數(shù)據(jù)集
datasets.load_()
獲取小規(guī)模數(shù)據(jù)集,數(shù)據(jù)包含在datasets里
datasets.fetch_(data_home=None)
獲取大規(guī)模數(shù)據(jù)集,需要從網(wǎng)絡(luò)上下載,函數(shù)的第一個參數(shù)是data_home,表示數(shù)據(jù)集下載的目錄,默認(rèn)是 ~/scikit_learn_data/
2.3 返回類型
load和fetch返回的數(shù)據(jù)類型datasets.base.Bunch(字典格式)
data:特征數(shù)據(jù)數(shù)組,是 [n_samples * n_features] 的二維 numpy.ndarray 數(shù)組
target:標(biāo)簽數(shù)組,是 n_samples 的一維 numpy.ndarray 數(shù)組
DESCR:數(shù)據(jù)描述
feature_names:特征名,新聞數(shù)據(jù),手寫數(shù)字、回歸數(shù)據(jù)集沒有
target_names:標(biāo)簽名
sklearn轉(zhuǎn)換器和估計器
學(xué)習(xí)目標(biāo)
目標(biāo)
知道sklearn的轉(zhuǎn)換器和估計器流程
應(yīng)用
無
1、轉(zhuǎn)換器和估計器
1.1 轉(zhuǎn)換器
想一下之前做的特征工程的步驟?
1、實例化 (實例化的是一個轉(zhuǎn)換器類(Transformer))
2、調(diào)用fit_transform(對于文檔建立分類詞頻矩陣,不能同時調(diào)用)
我們把特征工程的接口稱之為轉(zhuǎn)換器,其中轉(zhuǎn)換器調(diào)用有這么幾種形式
fit_transform
fit
transform
這幾個方法之間的區(qū)別是什么呢?我們看以下代碼就清楚了
In [1]: from sklearn.preprocessing import StandardScaler
In [2]: std1 = StandardScaler()
In [3]: a = [[1,2,3], [4,5,6]]
In [4]: std1.fit_transform(a)
Out[4]:
array([[-1., -1., -1.],
[ 1., 1., 1.]])
In [5]: std2 = StandardScaler()
In [6]: std2.fit(a)
Out[6]: StandardScaler(copy=True, with_mean=True, with_std=True)
In [7]: std2.transform(a)
Out[7]:
array([[-1., -1., -1.],
[ 1., 1., 1.]])
從中可以看出,fit_transform的作用相當(dāng)于transform加上fit。但是為什么還要提供單獨的fit呢, 我們還是使用原來的std2來進行標(biāo)準(zhǔn)化看看
In [8]: b = [[7,8,9], [10, 11, 12]]
In [9]: std2.transform(b)
Out[9]:
array([[3., 3., 3.],
[5., 5., 5.]])
In [10]: std2.fit_transform(b)
Out[10]:
array([[-1., -1., -1.],
[ 1., 1., 1.]])
1.2 估計器(sklearn機器學(xué)習(xí)算法的實現(xiàn))
在sklearn中,估計器(estimator)是一個重要的角色,是一類實現(xiàn)了算法的API
1、用于分類的估計器:
sklearn.neighbors k-近鄰算法
sklearn.naive_bayes 貝葉斯
sklearn.linear_model.LogisticRegression 邏輯回歸
sklearn.tree 決策樹與隨機森林
2、用于回歸的估計器:
sklearn.linear_model.LinearRegression 線性回歸
sklearn.linear_model.Ridge 嶺回歸
3、用于無監(jiān)督學(xué)習(xí)的估計器
sklearn.cluster.KMeans 聚類
1.3 估計器工作流程
估計器工作流程
K-近鄰算法
學(xué)習(xí)目標(biāo)
目標(biāo)
說明K-近鄰算法的距離公式
說明K-近鄰算法的超參數(shù)K值以及取值問題
說明K-近鄰算法的優(yōu)缺點
應(yīng)用KNeighborsClassifier實現(xiàn)分類
了解分類算法的評估標(biāo)準(zhǔn)準(zhǔn)確率
應(yīng)用
Facebook簽到位置預(yù)測
問題:回憶分類問題的判定方法
什么是K-近鄰算法
地圖K緊鄰算法
你的“鄰居”來推斷出你的類別
1、K-近鄰算法(KNN)
1.1 定義
如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個類別,則該樣本也屬于這個類別。
來源:KNN算法最早是由Cover和Hart提出的一種分類算法
1.2 距離公式
兩個樣本的距離可以通過如下公式計算,又叫歐式距離
距離公式
2、電影類型分析
假設(shè)我們有現(xiàn)在幾部電影
電影類型分析
其中? 號電影不知道類別,如何去預(yù)測?我們可以利用K近鄰算法的思想
電影距離計算
2.1 問題
如果去的最近的電影數(shù)量不一致?
2.2 K-近鄰算法數(shù)據(jù)的特征工程處理
結(jié)合前面的約會對象數(shù)據(jù),分析K-近鄰算法需要做什么樣的處理
3、K-近鄰算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘a(chǎn)uto’)
n_neighbors:int,可選(默認(rèn)= 5),k_neighbors查詢默認(rèn)使用的鄰居數(shù)
algorithm:{‘a(chǎn)uto’,‘ball_tree’,‘kd_tree’,‘brute’},可選用于計算最近鄰居的算法:‘ball_tree’將會使用 BallTree,‘kd_tree’將使用 KDTree。‘a(chǎn)uto’將嘗試根據(jù)傳遞給fit方法的值來決定最合適的算法。 (不同實現(xiàn)方式影響效率)
4、案例:預(yù)測簽到位置
FBlocation介紹
數(shù)據(jù)介紹:
train.csv,test.csv
row_id:登記事件的ID
xy:坐標(biāo)
準(zhǔn)確性:定位準(zhǔn)確性
時間:時間戳
place_id:業(yè)務(wù)的ID,這是您預(yù)測的目標(biāo)
4.1 分析
對于數(shù)據(jù)做一些基本處理(這里所做的一些處理不一定達(dá)到很好的效果,我們只是簡單嘗試,有些特征我們可以根據(jù)一些特征選擇的方式去做處理)
1、縮小數(shù)據(jù)集范圍 DataFrame.query()
2、處理日期數(shù)據(jù) pd.to_datetime pd.DatetimeIndex
3、增加分割的日期數(shù)據(jù)
4、刪除沒用的日期數(shù)據(jù) DataFrame.drop
5、將簽到位置少于n個用戶的刪除
place_count = data.groupby(‘place_id’).count()
tf = place_count[place_count.row_id > 3].reset_index()
data = data[data[‘place_id’].isin(tf.place_id)]
分割數(shù)據(jù)集
標(biāo)準(zhǔn)化處理
k-近鄰預(yù)測
4.2 代碼
def knncls():
“”"
K近鄰算法預(yù)測入住位置類別
:return:
“”"
# 一、處理數(shù)據(jù)以及特征工程
# 1、讀取收,縮小數(shù)據(jù)的范圍
data = pd.read_csv("./data/FBlocation/train.csv")
4.3 結(jié)果分析
準(zhǔn)確率: 分類算法的評估之一
1、k值取多大?有什么影響?
k值取很小:容易受到異常點的影響
k值取很大:受到樣本均衡的問題
2、性能問題?
距離計算上面,時間復(fù)雜度高
5、K-近鄰總結(jié)
優(yōu)點:
簡單,易于理解,易于實現(xiàn),無需訓(xùn)練
缺點:
懶惰算法,對測試樣本分類時的計算量大,內(nèi)存開銷大
必須指定K值,K值選擇不當(dāng)則分類精度不能保證
使用場景:小數(shù)據(jù)場景,幾千~幾萬樣本,具體場景具體業(yè)務(wù)去測試
模型選擇與調(diào)優(yōu)
學(xué)習(xí)目標(biāo)
目標(biāo)
說明交叉驗證過程
說明超參數(shù)搜索過程
應(yīng)用GridSearchCV實現(xiàn)算法參數(shù)的調(diào)優(yōu)
應(yīng)用
Facebook簽到位置預(yù)測調(diào)優(yōu)
1、為什么需要交叉驗證
交叉驗證目的:為了讓被評估的模型更加準(zhǔn)確可信
2、什么是交叉驗證(cross validation)
交叉驗證:將拿到的訓(xùn)練數(shù)據(jù),分為訓(xùn)練和驗證集。以下圖為例:將數(shù)據(jù)分成5份,其中一份作為驗證集。然后經(jīng)過5次(組)的測試,每次都更換不同的驗證集。即得到5組模型的結(jié)果,取平均值作為最終結(jié)果。又稱5折交叉驗證。
2.1 分析
我們之前知道數(shù)據(jù)分為訓(xùn)練集和測試集,但是為了讓從訓(xùn)練得到模型結(jié)果更加準(zhǔn)確。做以下處理
訓(xùn)練集:訓(xùn)練集+驗證集
測試集:測試集
交叉驗證過程
問題:那么這個只是對于參數(shù)得出更好的結(jié)果,那么怎么選擇或者調(diào)優(yōu)參數(shù)呢?
3、超參數(shù)搜索-網(wǎng)格搜索(Grid Search)
通常情況下,有很多參數(shù)是需要手動指定的(如k-近鄰算法中的K值),這種叫超參數(shù)。但是手動過程繁雜,所以需要對模型預(yù)設(shè)幾種超參數(shù)組合。每組超參數(shù)都采用交叉驗證來進行評估。最后選出最優(yōu)參數(shù)組合建立模型。
超參數(shù)
3.1 模型選擇與調(diào)優(yōu)
sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
對估計器的指定參數(shù)值進行詳盡搜索
estimator:估計器對象
param_grid:估計器參數(shù)(dict){“n_neighbors”:[1,3,5]}
cv:指定幾折交叉驗證
fit:輸入訓(xùn)練數(shù)據(jù)
score:準(zhǔn)確率
結(jié)果分析:
bestscore:在交叉驗證中驗證的最好結(jié)果_
bestestimator:最好的參數(shù)模型
cvresults:每次交叉驗證后的驗證集準(zhǔn)確率結(jié)果和訓(xùn)練集準(zhǔn)確率結(jié)果
4、Facebook簽到位置預(yù)測K值調(diào)優(yōu)
使用網(wǎng)格搜索估計器
使用網(wǎng)格搜索和交叉驗證找到合適的參數(shù)
knn = KNeighborsClassifier()
param = {“n_neighbors”: [3, 5, 10]}
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print(“選擇了某個模型測試集當(dāng)中預(yù)測的準(zhǔn)確率為:”, gc.score(x_test, y_test))
訓(xùn)練驗證集的結(jié)果
print(“在交叉驗證當(dāng)中驗證的最好結(jié)果:”, gc.best_score_)
print(“gc選擇了的模型K值是:”, gc.best_estimator_)
print(“每次交叉驗證的結(jié)果為:”, gc.cv_results_)
樸素貝葉斯算法
學(xué)習(xí)目標(biāo)
目標(biāo)
說明條件概率與聯(lián)合概率
說明貝葉斯公式、以及特征獨立的關(guān)系
記憶貝葉斯公式
知道拉普拉斯平滑系數(shù)
應(yīng)用貝葉斯公式實現(xiàn)概率的計算
應(yīng)用
20類新聞文章分類預(yù)測
1、 什么是樸素貝葉斯分類方法
垃圾郵件分類
文章分類
2、 概率基礎(chǔ)
2.1 概率(Probability)定義
概率定義為一件事情發(fā)生的可能性
扔出一個硬幣,結(jié)果頭像朝上
某天是晴天
P(X) : 取值在[0, 1]
2.2 女神是否喜歡計算案例
在講這兩個概率之前我們通過一個例子,來計算一些結(jié)果:
計算概率
問題如下:
概率問題
那么其中有些問題我們計算的結(jié)果不正確,或者不知道計算,我們有固定的公式去計算
2.3 條件概率與聯(lián)合概率
聯(lián)合概率:包含多個條件,且所有條件同時成立的概率
記作:P(A,B)
特性:P(A, B) = P(A)P(B)
條件概率:就是事件A在另外一個事件B已經(jīng)發(fā)生條件下的發(fā)生概率
記作:P(A|B)
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意:此條件概率的成立,是由于A1,A2相互獨立的結(jié)果(記憶)
這樣我們計算結(jié)果為:
p(程序員, 勻稱) = P(程序員)P(勻稱) =3/7*(4/7) = 12/49
P(產(chǎn)品, 超重|喜歡) = P(產(chǎn)品|喜歡)P(超重|喜歡)=1/2 * 1/4 = 1/8
那么,我們知道了這些知識之后,繼續(xù)回到我們的主題中。樸素貝葉斯如何分類,這個算法經(jīng)常會用在文本分類,那就來看文章分類是一個什么樣的問題?
文章分類引入
這個了類似一個條件概率,那么仔細(xì)一想,給定文章其實相當(dāng)于給定什么?結(jié)合前面我們將文本特征抽取的時候講的?所以我們可以理解為
文章分類引入2
但是這個公式怎么求?前面并沒有參考例子,其實是相似的,我們可以使用貝葉斯公式去計算
3、 貝葉斯公式
3.1 公式
貝葉斯公式
那么這個公式如果應(yīng)用在文章分類的場景當(dāng)中,我們可以這樣看:
貝葉斯公式理解
公式分為三個部分:
P?:每個文檔類別的概率(某文檔類別數(shù)/總文檔數(shù)量)
P(W│C):給定類別下特征(被預(yù)測文檔中出現(xiàn)的詞)的概率
計算方法:P(F1│C)=Ni/N (訓(xùn)練文檔中去計算)
Ni為該F1詞在C類別所有文檔中出現(xiàn)的次數(shù)
N為所屬類別C下的文檔所有詞出現(xiàn)的次數(shù)和
P(F1,F2,…) 預(yù)測文檔中每個詞的概率
如果計算兩個類別概率比較:
概率前面比較大小
所以我們只要比較前面的大小就可以,得出誰的概率大
3.2 文章分類計算
假設(shè)我們從訓(xùn)練數(shù)據(jù)集得到如下信息
分類計算例子
計算結(jié)果
科技:P(科技|影院,支付寶,云計算) = ?(影院,支付寶,云計算|科技)?P(科技)=(8/100)?(20/100)?(63/100)?(30/90) = 0.00456109
娛樂:P(娛樂|影院,支付寶,云計算) = ?(影院,支付寶,云計算|娛樂)?P(娛樂)=(56/121)?(15/121)?(0/121)?(60/90) = 0
思考:我們計算出來某個概率為0,合適嗎?
3.3 拉普拉斯平滑系數(shù)
目的:防止計算出的分類概率為0
平滑系數(shù)公式
P(娛樂|影院,支付寶,云計算) =P(影院,支付寶,云計算|娛樂)P(娛樂) =P(影院|娛樂)*P(支付寶|娛樂)P(云計算|娛樂)P(娛樂)=(56+1/121+4)(15+1/121+4)(0+1/121+14)(60/90) = 0.00002
3.4 API
sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
樸素貝葉斯分類
alpha:拉普拉斯平滑系數(shù)
4、案例:20類新聞分類
新聞分類介紹
4.1 分析
分割數(shù)據(jù)集
tfidf進行的特征抽取
樸素貝葉斯預(yù)測
4.2 代碼
def nbcls():
“”"
樸素貝葉斯對新聞數(shù)據(jù)集進行預(yù)測
:return:
“”"
# 獲取新聞的數(shù)據(jù),20個類別
news = fetch_20newsgroups(subset=‘a(chǎn)ll’)
5、總結(jié)
優(yōu)點:
樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有穩(wěn)定的分類效率。
對缺失數(shù)據(jù)不太敏感,算法也比較簡單,常用于文本分類。
分類準(zhǔn)確度高,速度快
缺點:
由于使用了樣本屬性獨立性的假設(shè),所以如果特征屬性有關(guān)聯(lián)時其效果不好
決策樹
學(xué)習(xí)目標(biāo)
目標(biāo)
說明信息熵的公式以及作用
說明信息增益的公式作用
應(yīng)用信息增益實現(xiàn)計算特征的不確定性減少程度
了解決策樹的三種算法實現(xiàn)
應(yīng)用
泰坦尼克號乘客生存預(yù)測
1、認(rèn)識決策樹
決策樹思想的來源非常樸素,程序設(shè)計中的條件分支結(jié)構(gòu)就是if-then結(jié)構(gòu),最早的決策樹就是利用這類結(jié)構(gòu)分割數(shù)據(jù)的一種分類學(xué)習(xí)方法
怎么理解這句話?通過一個對話例子
相親對話
想一想這個女生為什么把年齡放在最上面判斷!!!!!!!!!
2、決策樹分類原理詳解
為了更好理解決策樹具體怎么分類的,我們通過一個問題例子?
銀行貸款數(shù)
問題:如何對這些客戶進行分類預(yù)測?你是如何去劃分?
有可能你的劃分是這樣的
貸款劃分1
那么我們怎么知道這些特征哪個更好放在最上面,那么決策樹的真是劃分是這樣的
貸款劃分2
2.1 原理
信息熵、信息增益等
需要用到信息論的知識!!!問題:通過例子引入信息熵
2.2 信息熵
那來玩?zhèn)€猜測游戲,猜猜這32支球隊那個是冠軍。并且猜測錯誤付出代價。每猜錯一次給一塊錢,告訴我是否猜對了,那么我需要掏多少錢才能知道誰是冠軍? (前提是:不知道任意球隊的信息、歷史比賽記錄、實力等)
足球隊
為了使代價最小,可以使用二分法猜測:
我可以把球編上號,從1到32,然后提問:冠 軍在1-16號嗎?依次詢問,只需要五次,就可以知道結(jié)果。
二分法猜測
我們來看這個式子:
32支球隊,log32=5比特
64支球隊,log64=6比特
香農(nóng)
香農(nóng)指出,它的準(zhǔn)確信息量應(yīng)該是,p為每個球隊獲勝的概率(假設(shè)概率相等,都為1/32),我們不用錢去衡量這個代價了,香濃指出用比特:
H = -(p1logp1 + p2logp2 + … + p32log32) = - log32
2.2.1 信息熵的定義
H的專業(yè)術(shù)語稱之為信息熵,單位為比特。
信息熵公式
“誰是世界杯冠軍”的信息量應(yīng)該比5比特少,特點(重要):
當(dāng)這32支球隊奪冠的幾率相同時,對應(yīng)的信息熵等于5比特
只要概率發(fā)生任意變化,信息熵都比5比特大
2.2.2 總結(jié)(重要)
信息和消除不確定性是相聯(lián)系的
當(dāng)我們得到的額外信息(球隊歷史比賽情況等等)越多的話,那么我們猜測的代價越小(猜測的不確定性減小)
問題: 回到我們前面的貸款案例,怎么去劃分?可以利用當(dāng)?shù)弥硞€特征(比如是否有房子)之后,我們能夠減少的不確定性大小。越大我們可以認(rèn)為這個特征很重要。那怎么去衡量減少的不確定性大小呢?
2.3 決策樹的劃分依據(jù)之一------信息增益
2.3.1 定義與公式
特征A對訓(xùn)練數(shù)據(jù)集D的信息增益g(D,A),定義為集合D的信息熵H(D)與特征A給定條件下D的信息條件熵H(D|A)之差,即公式為:
信息增益公式
公式的詳細(xì)解釋:
信息增益公式詳解
注:信息增益表示得知特征X的信息而息的不確定性減少的程度使得類Y的信息熵減少的程度
2.3.2 貸款特征重要計算
銀行貸款數(shù)
我們以年齡特征來計算:
1、g(D, 年齡) = H(D) -H(D|年齡) = 0.971-[5/15H(青年)+5/15H(中年)+5/15H(老年]
2、H(D) = -(6/15log(6/15)+9/15log(9/15))=0.971
3、H(青年) = -(3/5log(3/5) +2/5log(2/5))
H(中年)=-(3/5log(3/5) +2/5log(2/5))
H(老年)=-(4/5og(4/5)+1/5log(1/5))
我們以A1、A2、A3、A4代表年齡、有工作、有自己的房子和貸款情況。最終計算的結(jié)果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我們選擇A3 作為劃分的第一個特征。這樣我們就可以一棵樹慢慢建立
2.4 決策樹的三種算法實現(xiàn)
當(dāng)然決策樹的原理不止信息增益這一種,還有其他方法。但是原理都類似,我們就不去舉例計算。
ID3
信息增益 最大的準(zhǔn)則
C4.5
信息增益比 最大的準(zhǔn)則
CART
分類樹: 基尼系數(shù) 最小的準(zhǔn)則 在sklearn中可以選擇劃分的默認(rèn)原則
優(yōu)勢:劃分更加細(xì)致(從后面例子的樹顯示來理解)
2.5 決策樹API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
決策樹分類器
criterion:默認(rèn)是’gini’系數(shù),也可以選擇信息增益的熵’entropy’
max_depth:樹的深度大小
random_state:隨機數(shù)種子
其中會有些超參數(shù):max_depth:樹的深度大小
其它超參數(shù)我們會結(jié)合隨機森林講解
3、案例:泰坦尼克號乘客生存預(yù)測
泰坦尼克號數(shù)據(jù)
在泰坦尼克號和titanic2數(shù)據(jù)幀描述泰坦尼克號上的個別乘客的生存狀態(tài)。這里使用的數(shù)據(jù)集是由各種研究人員開始的。其中包括許多研究人員創(chuàng)建的旅客名單,由Michael A. Findlay編輯。我們提取的數(shù)據(jù)集中的特征是票的類別,存活,乘坐班,年齡,登陸,home.dest,房間,票,船和性別。
1、乘坐班是指乘客班(1,2,3),是社會經(jīng)濟階層的代表。
2、其中age數(shù)據(jù)存在缺失。
數(shù)據(jù):http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
泰坦尼克號數(shù)據(jù)
3.1 分析
選擇我們認(rèn)為重要的幾個特征 [‘pclass’, ‘a(chǎn)ge’, ‘sex’]
填充缺失值
特征中出現(xiàn)類別符號,需要進行one-hot編碼處理(DictVectorizer)
x.to_dict(orient=“records”) 需要將數(shù)組特征轉(zhuǎn)換成字典數(shù)據(jù)
數(shù)據(jù)集劃分
決策樹分類預(yù)測
3.2 代碼
def decisioncls():
“”"
決策樹進行乘客生存預(yù)測
:return:
“”"
# 1、獲取數(shù)據(jù)
titan = pd.read_csv(“http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt”)
由于決策樹類似一個樹的結(jié)構(gòu),我們可以保存到本地顯示
3.3 保存樹的結(jié)構(gòu)到dot文件
1、sklearn.tree.export_graphviz() 該函數(shù)能夠?qū)С鯠OT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
2、工具:(能夠?qū)ot文件轉(zhuǎn)換為pdf、png)
安裝graphviz
ubuntu:sudo apt-get install graphviz Mac:brew install graphviz
3、運行命令
然后我們運行這個命令
dot -Tpng tree.dot -o tree.png
export_graphviz(dc, out_file="./tree.dot", feature_names=[‘a(chǎn)ge’, ‘pclass=1st’, ‘pclass=2nd’, ‘pclass=3rd’, ‘女性’, ‘男性’])
4、 決策樹總結(jié)
優(yōu)點:
簡單的理解和解釋,樹木可視化。
缺點:
決策樹學(xué)習(xí)者可以創(chuàng)建不能很好地推廣數(shù)據(jù)的過于復(fù)雜的樹,這被稱為過擬合。
改進:
減枝cart算法(決策樹API當(dāng)中已經(jīng)實現(xiàn),隨機森林參數(shù)調(diào)優(yōu)有相關(guān)介紹)
隨機森林
注:企業(yè)重要決策,由于決策樹很好的分析能力,在決策過程應(yīng)用較多, 可以選擇特征
集成學(xué)習(xí)方法之隨機森林
學(xué)習(xí)目標(biāo)
目標(biāo)
說名隨機森林每棵決策樹的建立過程
知道為什么需要隨機有放回(Bootstrap)的抽樣
說明隨機森林的超參數(shù)
應(yīng)用
泰坦尼克號乘客生存預(yù)測
1、 什么是集成學(xué)習(xí)方法
集成學(xué)習(xí)通過建立幾個模型組合的來解決單一預(yù)測問題。它的工作原理是生成多個分類器/模型,各自獨立地學(xué)習(xí)和作出預(yù)測。這些預(yù)測最后結(jié)合成組合預(yù)測,因此優(yōu)于任何一個單分類的做出預(yù)測。
2、 什么是隨機森林
在機器學(xué)習(xí)中,隨機森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數(shù)而定。
隨機森林
例如, 如果你訓(xùn)練了5個樹, 其中有4個樹的結(jié)果是True, 1個數(shù)的結(jié)果是False, 那么最終投票結(jié)果就是True
投票
3、 隨機森林原理過程
學(xué)習(xí)算法根據(jù)下列算法而建造每棵樹:
用N來表示訓(xùn)練用例(樣本)的個數(shù),M表示特征數(shù)目。
1、一次隨機選出一個樣本,重復(fù)N次, (有可能出現(xiàn)重復(fù)的樣本)
2、隨機去選出m個特征, m <<M,建立決策樹
采取bootstrap抽樣
3.1 為什么采用BootStrap抽樣
為什么要隨機抽樣訓(xùn)練集?
如果不進行隨機抽樣,每棵樹的訓(xùn)練集都一樣,那么最終訓(xùn)練出的樹分類結(jié)果也是完全一樣的
為什么要有放回地抽樣?
如果不是有放回的抽樣,那么每棵樹的訓(xùn)練樣本都是不同的,都是沒有交集的,這樣每棵樹都是“有偏的”,都是絕對“片面的”(當(dāng)然這樣說可能不對),也就是說每棵樹訓(xùn)練出來都是有很大的差異的;而隨機森林最后分類取決于多棵樹(弱分類器)的投票表決。
3.2 API
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
隨機森林分類器
n_estimators:integer,optional(default = 10)森林里的樹木數(shù)量120,200,300,500,800,1200
criteria:string,可選(default =“gini”)分割特征的測量方法
max_depth:integer或None,可選(默認(rèn)=無)樹的最大深度 5,8,15,25,30
max_features="auto”,每個決策樹的最大特征數(shù)量
If “auto”, then max_features=sqrt(n_features).
If “sqrt”, then max_features=sqrt(n_features) (same as “auto”).
If “l(fā)og2”, then max_features=log2(n_features).
If None, then max_features=n_features.
bootstrap:boolean,optional(default = True)是否在構(gòu)建樹時使用放回抽樣
min_samples_split:節(jié)點劃分最少樣本數(shù)
min_samples_leaf:葉子節(jié)點的最小樣本數(shù)
超參數(shù):n_estimator, max_depth, min_samples_split,min_samples_leaf
3.3 代碼
隨機森林去進行預(yù)測
rf = RandomForestClassifier()
param = {“n_estimators”: [120,200,300,500,800,1200], “max_depth”: [5, 8, 15, 25, 30]}
超參數(shù)調(diào)優(yōu)
gc = GridSearchCV(rf, param_grid=param, cv=2)
gc.fit(x_train, y_train)
print(“隨機森林預(yù)測的準(zhǔn)確率為:”, gc.score(x_test, y_test))
4、總結(jié)
在當(dāng)前所有算法中,具有極好的準(zhǔn)確率
能夠有效地運行在大數(shù)據(jù)集上,處理具有高維特征的輸入樣本,而且不需要降維
能夠評估各個特征在分類問題上的重要性
回歸與聚類算法
說明線性回歸的原理
應(yīng)用LinearRegression或SGDRegressor實現(xiàn)回歸預(yù)測
記憶回歸算法的評估標(biāo)準(zhǔn)及其公式
說明線性回歸的缺點
說明過擬合與欠擬合的原因以及解決方法
說明嶺回歸的原理即與線性回歸的不同之處
說明正則化對于權(quán)重參數(shù)的影響
說明L1和L2正則化的區(qū)別
說明邏輯回歸的原理
知道邏輯回歸的應(yīng)用場景
說明分類(主要針對二分類)問題的評估標(biāo)準(zhǔn)
應(yīng)用classification_report實現(xiàn)精確率、召回率計算
應(yīng)用roc_auc_score實現(xiàn)指標(biāo)計算
應(yīng)用joblib實現(xiàn)模型的保存與加載
說明K-means算法原理
說明K-means的性能評估標(biāo)準(zhǔn)輪廓系數(shù)
說明K-means的優(yōu)缺點
線性回歸
學(xué)習(xí)目標(biāo)
目標(biāo)
記憶線性回歸的原理過程
應(yīng)用LinearRegression或SGDRegressor實現(xiàn)回歸預(yù)測
記憶回歸算法的評估標(biāo)準(zhǔn)及其公式
應(yīng)用
波士頓房價預(yù)測
回憶一下回歸問題的判定是什么?
1、 線性回歸的原理
1.1 線性回歸應(yīng)用場景
房價預(yù)測
銷售額度預(yù)測
金融:貸款額度預(yù)測、利用線性回歸以及系數(shù)分析因子和選股
銷售額度
1.2 什么是線性回歸
1.2.1定義與公式
線性回歸(Linear regression)是利用回歸方程(函數(shù))對一個或多個自變量(特征值)和因變量(目標(biāo)值)之間關(guān)系進行建模的一種分析方式。
特點:只有一個自變量的情況稱為單變量回歸,大于一個自變量情況的叫做多元回歸
線性回歸公式
那么怎么理解呢?我們來看幾個例子
期末成績:0.7×考試成績+0.3×平時成績
房子價格 = 0.02×中心區(qū)域的距離 + 0.04×城市一氧化氮濃度 + (-0.12×自住房平均房價) + 0.254×城鎮(zhèn)犯罪率
上面兩個例子,我們看到特征值與目標(biāo)值之間建立的一個關(guān)系,這個可以理解為回歸方程。
1.2.2 線性回歸的特征與目標(biāo)的關(guān)系分析
線性回歸當(dāng)中的關(guān)系有兩種,一種是線性關(guān)系,另一種是非線性關(guān)系。在這里我們只能畫一個平面更好去理解,所以都用單個特征舉例子。
線性關(guān)系
線性關(guān)系圖
多變量線性關(guān)系
注釋:如果在單特征與目標(biāo)值的關(guān)系呈直線關(guān)系,或者兩個特征與目標(biāo)值呈現(xiàn)平面的關(guān)系
更高維度的我們不用自己去想,記住這種關(guān)系即可
非線性關(guān)系
非線性關(guān)系
注釋:為什么會這樣的關(guān)系呢?原因是什么?我們后面 講解過擬合欠擬合重點介紹
如果是非線性關(guān)系,那么回歸方程可以理解為:w1x1+w2x22+w3x32
2、線性回歸的損失和優(yōu)化原理(理解記憶)
假設(shè)剛才的房子例子,真實的數(shù)據(jù)之間存在這樣的關(guān)系
真實關(guān)系:真實房子價格 = 0.02×中心區(qū)域的距離 + 0.04×城市一氧化氮濃度 + (-0.12×自住房平均房價) + 0.254×城鎮(zhèn)犯罪率
那么現(xiàn)在呢,我們隨意指定一個關(guān)系(猜測)
隨機指定關(guān)系:預(yù)測房子價格 = 0.25×中心區(qū)域的距離 + 0.14×城市一氧化氮濃度 + 0.42×自住房平均房價 + 0.34×城鎮(zhèn)犯罪率
請問這樣的話,會發(fā)生什么?真實結(jié)果與我們預(yù)測的結(jié)果之間是不是存在一定的誤差呢?類似這樣樣子
誤差
那么存在這個誤差,我們將這個誤差給衡量出來
2.1 損失函數(shù)
總損失定義為:
線性回歸損失函數(shù)
y_i為第i個訓(xùn)練樣本的真實值
h(x_i)為第i個訓(xùn)練樣本特征值組合預(yù)測函數(shù)
又稱最小二乘法
如何去減少這個損失,使我們預(yù)測的更加準(zhǔn)確些?既然存在了這個損失,我們一直說機器學(xué)習(xí)有自動學(xué)習(xí)的功能,在線性回歸這里更是能夠體現(xiàn)。這里可以通過一些優(yōu)化方法去優(yōu)化(其實是數(shù)學(xué)當(dāng)中的求導(dǎo)功能)回歸的總損失!!!
2.2 優(yōu)化算法
如何去求模型當(dāng)中的W,使得損失最小?(目的是找到最小損失對應(yīng)的W值)
線性回歸經(jīng)常使用的兩種優(yōu)化算法
正規(guī)方程
正規(guī)方程
理解:X為特征值矩陣,y為目標(biāo)值矩陣。直接求到最好的結(jié)果
缺點:當(dāng)特征過多過復(fù)雜時,求解速度太慢并且得不到結(jié)果
損失行數(shù)求解1
梯度下降(Gradient Descent)
梯度下降公式
理解:α為學(xué)習(xí)速率,需要手動指定(超參數(shù)),α旁邊的整體表示方向
沿著這個函數(shù)下降的方向找,最后就能找到山谷的最低點,然后更新W值
使用:面對訓(xùn)練數(shù)據(jù)規(guī)模十分龐大的任務(wù) ,能夠找到較好的結(jié)果
我們通過兩個圖更好理解梯度下降的過程
單變量的梯度下降
多變量的梯度下降
所以有了梯度下降這樣一個優(yōu)化算法,回歸就有了"自動學(xué)習(xí)"的能力
3、 線性回歸API
sklearn.linear_model.LinearRegression(fit_intercept=True)
通過正規(guī)方程優(yōu)化
fit_intercept:是否計算偏置
LinearRegression.coef_:回歸系數(shù)
LinearRegression.intercept_:偏置
sklearn.linear_model.SGDRegressor(loss=“squared_loss”, fit_intercept=True, learning_rate =‘invscaling’, eta0=0.01)
通過使用SGD優(yōu)化
loss:損失類型 *
fit_intercept:是否計算偏置
learning_rate : string, optional
學(xué)習(xí)率填充
‘constant’: eta = eta0
‘optimal’: eta = 1.0 / (alpha * (t + t0)) [default]
‘invscaling’: eta = eta0 / pow(t, power_t)
power_t=0.25:存在父類當(dāng)中
SGDRegressor.coef_:回歸系數(shù)
SGDRegressor.intercept_:偏置
sklearn提供給我們兩種實現(xiàn)的API, 可以根據(jù)選擇使用
4、波士頓房價預(yù)測
數(shù)據(jù)介紹
房價數(shù)據(jù)集介紹
屬性
給定的這些特征,是專家們得出的影響房價的結(jié)果屬性。我們此階段不需要自己去探究特征是否有用,只需要使用這些特征。到后面量化很多特征需要我們自己去尋找
4.1 分析
回歸當(dāng)中的數(shù)據(jù)大小不一致,是否會導(dǎo)致結(jié)果影響較大。所以需要做標(biāo)準(zhǔn)化處理。同時我們對目標(biāo)值也需要做標(biāo)準(zhǔn)化處理。
數(shù)據(jù)分割與標(biāo)準(zhǔn)化處理
回歸預(yù)測
線性回歸的算法效果評估
4.2 回歸性能評估
均方誤差(Mean Squared Error)MSE)評價機制:
線性回歸評估
注:y^i為預(yù)測值,ˉy為真實值
sklearn.metrics.mean_squared_error(y_true, y_pred)
均方誤差回歸損失
y_true:真實值
y_pred:預(yù)測值
return:浮點數(shù)結(jié)果
4.2 代碼
def mylinearregression():
“”"
線性回歸預(yù)測房子價格
:return:
“”"
lb = load_boston()
#
# print(lb.data)
#
# print(lb.target)
當(dāng)我們嘗試去修改學(xué)習(xí)率的時候
sgd = SGDRegressor(learning_rate=‘constant’, eta0=0.5)
可以看到效果會更好,此時我們可以通過調(diào)參數(shù),找到學(xué)習(xí)率效果更好的值。
這里的案例數(shù)據(jù)比較簡單,所以效果非常不錯??梢栽跀?shù)據(jù)量、特征復(fù)雜的數(shù)據(jù)中進行測試
4.3 正規(guī)方程和梯度下降對比
正規(guī)方程和梯度下降對比
文字對比
梯度下降 正規(guī)方程
需要選擇學(xué)習(xí)率 不需要
需要迭代求解 一次運算得出
特征數(shù)量較大可以使用 需要計算方程,時間復(fù)雜度高O(n3)
選擇:
小規(guī)模數(shù)據(jù):
LinearRegression(不能解決擬合問題)
嶺回歸
大規(guī)模數(shù)據(jù):SGDRegressor
5、總結(jié)
線性回歸的損失函數(shù)-均方誤差
線性回歸的優(yōu)化方法
正規(guī)方程
梯度下降
線性回歸的性能衡量方法-均方誤差
sklearn的SGDRegressor API 參數(shù)
欠擬合與過擬合
學(xué)習(xí)目標(biāo)
目標(biāo)
說明線性回歸(不帶正則化)的缺點
說明過擬合與欠擬合的原因以及解決方法
應(yīng)用
無
問題:訓(xùn)練數(shù)據(jù)訓(xùn)練的很好啊,誤差也不大,為什么在測試集上面有問題呢?
當(dāng)算法在某個數(shù)據(jù)集當(dāng)中出現(xiàn)這種情況,可能就出現(xiàn)了過擬合現(xiàn)象。
1、 什么是過擬合與欠擬合
欠擬合
欠擬合
過擬合
過擬合
分析
第一種情況:因為機器學(xué)習(xí)到的天鵝特征太少了,導(dǎo)致區(qū)分標(biāo)準(zhǔn)太粗糙,不能準(zhǔn)確識別出天鵝。
第二種情況:機器已經(jīng)基本能區(qū)別天鵝和其他動物了。然后,很不巧已有的天鵝圖片全是白天鵝的,于是機器經(jīng)過學(xué)習(xí)后,會認(rèn)為天鵝的羽毛都是白的,以后看到羽毛是黑的天鵝就會認(rèn)為那不是天鵝。
1.1 定義
過擬合:一個假設(shè)在訓(xùn)練數(shù)據(jù)上能夠獲得比其他假設(shè)更好的擬合, 但是在測試數(shù)據(jù)集上卻不能很好地擬合數(shù)據(jù),此時認(rèn)為這個假設(shè)出現(xiàn)了過擬合的現(xiàn)象。(模型過于復(fù)雜)
欠擬合:一個假設(shè)在訓(xùn)練數(shù)據(jù)上不能獲得更好的擬合,并且在測試數(shù)據(jù)集上也不能很好地擬合數(shù)據(jù),此時認(rèn)為這個假設(shè)出現(xiàn)了欠擬合的現(xiàn)象。(模型過于簡單)
欠擬合過擬合圖示
那么是什么原因?qū)е履P蛷?fù)雜?線性回歸進行訓(xùn)練學(xué)習(xí)的時候變成模型會變得復(fù)雜,這里就對應(yīng)前面再說的線性回歸的兩種關(guān)系,非線性關(guān)系的數(shù)據(jù),也就是存在很多無用的特征或者現(xiàn)實中的事物特征跟目標(biāo)值的關(guān)系并不是簡單的線性關(guān)系。
2、 原因以及解決辦法
欠擬合原因以及解決辦法
原因:學(xué)習(xí)到數(shù)據(jù)的特征過少
解決辦法:增加數(shù)據(jù)的特征數(shù)量
過擬合原因以及解決辦法
原因:原始特征過多,存在一些嘈雜特征, 模型過于復(fù)雜是因為模型嘗試去兼顧各個測試數(shù)據(jù)點
解決辦法:
正則化
在這里針對回歸,我們選擇了正則化。但是對于其他機器學(xué)習(xí)算法如分類算法來說也會出現(xiàn)這樣的問題,除了一些算法本身作用之外(決策樹、神經(jīng)網(wǎng)絡(luò)),我們更多的也是去自己做特征選擇,包括之前說的刪除、合并一些特征
模型復(fù)雜
如何解決?
正則化
在學(xué)習(xí)的時候,數(shù)據(jù)提供的特征有些影響模型復(fù)雜度或者這個特征的數(shù)據(jù)點異常較多,所以算法在學(xué)習(xí)的時候盡量減少這個特征的影響(甚至刪除某個特征的影響),這就是正則化
注:調(diào)整時候,算法并不知道某個特征影響,而是去調(diào)整參數(shù)得出優(yōu)化的結(jié)果
2.1 正則化類別
L2正則化
作用:可以使得其中一些W的都很小,都接近于0,削弱某個特征的影響
優(yōu)點:越小的參數(shù)說明模型越簡單,越簡單的模型則越不容易產(chǎn)生過擬合現(xiàn)象
Ridge回歸
L1正則化
作用:可以使得其中一些W的值直接為0,刪除這個特征的影響
LASSO回歸
2.2 拓展-原理(了解)
線性回歸的損失函數(shù)用最小二乘法,等價于當(dāng)預(yù)測值與真實值的誤差滿足正態(tài)分布時的極大似然估計;嶺回歸的損失函數(shù),是最小二乘法+L2范數(shù),等價于當(dāng)預(yù)測值與真實值的誤差滿足正態(tài)分布,且權(quán)重值也滿足正態(tài)分布(先驗分布)時的最大后驗估計;LASSO的損失函數(shù),是最小二乘法+L1范數(shù),等價于等價于當(dāng)預(yù)測值與真實值的誤差滿足正態(tài)分布,且且權(quán)重值滿足拉普拉斯分布(先驗分布)時的最大后驗估計
線性回歸的改進-嶺回歸
學(xué)習(xí)目標(biāo)
目標(biāo)
說明嶺回歸的原理即與線性回歸的不同之處
說明正則化對于權(quán)重參數(shù)的影響
說明L1和L2正則化的區(qū)別
應(yīng)用
波士頓房價預(yù)測
1、 帶有L2正則化的線性回歸-嶺回歸
嶺回歸,其實也是一種線性回歸。只不過在算法建立回歸方程時候,加上正則化的限制,從而達(dá)到解決過擬合的效果
1.1 API
sklearn.linear_model.Ridge(alpha=1.0)
具有l(wèi)2正則化的線性回歸
alpha:正則化力度,也叫 λ
λ取值:0~1 1~10
coef_:回歸系數(shù)
sklearn.linear_model.RidgeCV(BaseRidgeCV, RegressorMixin)
具有l(wèi)2正則化的線性回歸,可以進行交叉驗證
coef:回歸系數(shù)
class _BaseRidgeCV(LinearModel):
def init(self, alphas=(0.1, 1.0, 10.0),
fit_intercept=True, normalize=False, scoring=None,
cv=None, gcv_mode=None,
store_cv_values=False):
1.2 觀察正則化程度的變化,對結(jié)果的影響?
正則化力度
正則化力度越大,權(quán)重系數(shù)會越小
正則化力度越小,權(quán)重系數(shù)會越大
1.3 波士頓房價預(yù)測
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(“嶺回歸的權(quán)重參數(shù)為:”, rd.coef_)
y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
print(“嶺回歸的預(yù)測的結(jié)果為:”, y_rd_predict)
print(“嶺回歸的均方誤差為:”, mean_squared_error(y_test, y_rd_predict))
分類算法-邏輯回歸與二分類
學(xué)習(xí)目標(biāo)
目標(biāo)
說明邏輯回歸的損失函數(shù)
說明邏輯回歸的優(yōu)化方法
說明sigmoid函數(shù)
知道邏輯回歸的應(yīng)用場景
知道精確率、召回率指標(biāo)的區(qū)別
知道F1-score指標(biāo)說明召回率的實際意義
說明如何解決樣本不均衡情況下的評估
了解ROC曲線的意義說明AUC指標(biāo)大小
應(yīng)用classification_report實現(xiàn)精確率、召回率計算
應(yīng)用roc_auc_score實現(xiàn)指標(biāo)計算
應(yīng)用
癌癥患者預(yù)測
邏輯回歸(Logistic Regression)是機器學(xué)習(xí)中的一種分類模型,邏輯回歸是一種分類算法,雖然名字中帶有回歸,但是它與回歸之間有一定的聯(lián)系。由于算法的簡單和高效,在實際中應(yīng)用非常廣泛。
1、邏輯回歸的應(yīng)用場景
廣告點擊率
是否為垃圾郵件
是否患病
金融詐騙
虛假賬號
看到上面的例子,我們可以發(fā)現(xiàn)其中的特點,那就是都屬于兩個類別之間的判斷。邏輯回歸就是解決二分類問題的利器
2、 邏輯回歸的原理
2.1 輸入
邏輯回歸輸入
邏輯回歸的輸入就是一個線性回歸的結(jié)果。
2.2 激活函數(shù)
sigmoid函數(shù)
sigmoid公式
分析
回歸的結(jié)果輸入到sigmoid函數(shù)當(dāng)中
輸出結(jié)果:[0, 1]區(qū)間中的一個概率值,默認(rèn)為0.5為閾值
邏輯回歸最終的分類是通過屬于某個類別的概率值來判斷是否屬于某個類別,并且這個類別默認(rèn)標(biāo)記為1(正例),另外的一個類別會標(biāo)記為0(反例)。(方便損失計算)
輸出結(jié)果解釋(重要):假設(shè)有兩個類別A,B,并且假設(shè)我們的概率值為屬于A(1)這個類別的概率值?,F(xiàn)在有一個樣本的輸入到邏輯回歸輸出結(jié)果0.6,那么這個概率值超過0.5,意味著我們訓(xùn)練或者預(yù)測的結(jié)果就是A(1)類別。那么反之,如果得出結(jié)果為0.3那么,訓(xùn)練或者預(yù)測結(jié)果就為B(0)類別。
所以接下來我們回憶之前的線性回歸預(yù)測結(jié)果我們用均方誤差衡量,那如果對于邏輯回歸,我們預(yù)測的結(jié)果不對該怎么去衡量這個損失呢?我們來看這樣一張圖
邏輯回歸運算過程
那么如何去衡量邏輯回歸的預(yù)測結(jié)果與真實結(jié)果的差異呢?
2.3 損失以及優(yōu)化
2.3.1 損失
邏輯回歸的損失,稱之為對數(shù)似然損失,公式如下:
分開類別:
單個對數(shù)似然損失
怎么理解單個的式子呢?這個要根據(jù)log的函數(shù)圖像來理解
單個損失解釋
綜合完整損失函數(shù)
完整對數(shù)似然損失
看到這個式子,其實跟我們講的信息熵類似。
接下來我們呢就帶入上面那個例子來計算一遍,就能理解意義了。
損失計算過程
我們已經(jīng)知道,log§, P值越大,結(jié)果越小,所以我們可以對著這個損失的式子去分析
2.3.2 優(yōu)化
同樣使用梯度下降優(yōu)化算法,去減少損失函數(shù)的值。這樣去更新邏輯回歸前面對應(yīng)算法的權(quán)重參數(shù),提升原本屬于1類別的概率,降低原本是0類別的概率。
拓展-關(guān)于邏輯回歸的損失和線性回歸的損失優(yōu)化問題
均方誤差這種損失函數(shù),是一定能夠通過梯度下降找到最優(yōu)解。
3、邏輯回歸API
sklearn.linear_model.LogisticRegression(solver=‘liblinear’, penalty=‘l2’, C = 1.0)
solver:優(yōu)化求解方式(默認(rèn)開源的liblinear庫實現(xiàn),內(nèi)部使用了坐標(biāo)軸下降法來迭代優(yōu)化損失函數(shù))
sag:隨機平均梯度下降
penalty:正則化的種類
C:正則化力度
默認(rèn)將類別數(shù)量少的當(dāng)做正例
4、 案例:癌癥分類預(yù)測-良/惡性乳腺癌腫瘤預(yù)測
數(shù)據(jù)介紹
癌癥數(shù)據(jù)
原始數(shù)據(jù)的下載地址:https://archive.ics.uci.edu/ml/machine-learning-databases/
數(shù)據(jù)描述
(1)699條樣本,共11列數(shù)據(jù),第一列用語檢索的id,后9列分別是與腫瘤
相關(guān)的醫(yī)學(xué)特征,最后一列表示腫瘤類型的數(shù)值。
(2)包含16個缺失值,用”?”標(biāo)出。
4.1 分析
缺失值處理
標(biāo)準(zhǔn)化處理
邏輯回歸預(yù)測
4.2 代碼
def logisticregression():
“”"
邏輯回歸進行癌癥預(yù)測
:return: None
“”"
# 1、讀取數(shù)據(jù),處理缺失值以及標(biāo)準(zhǔn)化
column_name = [‘Sample code number’, ‘Clump Thickness’, ‘Uniformity of Cell Size’, ‘Uniformity of Cell Shape’,
‘Marginal Adhesion’, ‘Single Epithelial Cell Size’, ‘Bare Nuclei’, ‘Bland Chromatin’,
‘Normal Nucleoli’, ‘Mitoses’, ‘Class’]
在很多分類場景當(dāng)中我們不一定只關(guān)注預(yù)測的準(zhǔn)確率!!!!!
手機評判好壞
比如以這個癌癥舉例子!!!我們并不關(guān)注預(yù)測的準(zhǔn)確率,而是關(guān)注在所有的樣本當(dāng)中,癌癥患者有沒有被全部預(yù)測(檢測)出來。
5、分類的評估方法
5.1 精確率與召回率
5.1.1混淆矩陣
在分類任務(wù)下,預(yù)測結(jié)果(Predicted Condition)與正確標(biāo)記(True Condition)之間存在四種不同的組合,構(gòu)成混淆矩陣(適用于多分類)
混淆矩陣
5.1.2 精確率(Precision)與召回率(Recall)
精確率:預(yù)測結(jié)果為正例樣本中真實為正例的比例(了解)
精確率
召回率:真實為正例的樣本中預(yù)測結(jié)果為正例的比例(查的全,對正樣本的區(qū)分能力)
召回率
那么怎么更好理解這個兩個概念
精確率與召回率理解
還有其他的評估標(biāo)準(zhǔn),F1-score,反映了模型的穩(wěn)健型
F1
5.1.3 分類評估報告API
sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
y_true:真實目標(biāo)值
y_pred:估計器預(yù)測目標(biāo)值
labels:指定類別對應(yīng)的數(shù)字
target_names:目標(biāo)類別名稱
return:每個類別精確率與召回率
print(“精確率和召回率為:”, classification_report(y_test, lr.predict(x_test), labels=[2, 4], target_names=[‘良性’, ‘惡性’]))
假設(shè)這樣一個情況,如果99個樣本癌癥,1個樣本非癌癥,不管怎樣我全都預(yù)測正例(默認(rèn)癌癥為正例),準(zhǔn)確率就為99%但是這樣效果并不好,這就是樣本不均衡下的評估問題
問題:如何衡量樣本不均衡下的評估?
5.2 ROC曲線與AUC指標(biāo)
5.2.1 知道TPR與FPR
TPR = TP / (TP + FN)
所有真實類別為1的樣本中,預(yù)測類別為1的比例
FPR = FP / (FP + FN)
所有真實類別為0的樣本中,預(yù)測類別為1的比例
5.2.2 ROC曲線
ROC曲線的橫軸就是FPRate,縱軸就是TPRate,當(dāng)二者相等時,表示的意義則是:對于不論真實類別是1還是0的樣本,分類器預(yù)測為1的概率是相等的,此時AUC為0.5
ROC
5.2.3AUC指標(biāo)
AUC的概率意義是隨機取一對正負(fù)樣本,正樣本得分大于負(fù)樣本的概率
AUC的最小值為0.5,最大值為1,取值越高越好
AUC=1,完美分類器,采用這個預(yù)測模型時,不管設(shè)定什么閾值都能得出完美預(yù)測。絕大多數(shù)預(yù)測的場合,不存在完美分類器。
0.5<AUC<1,優(yōu)于隨機猜測。這個分類器(模型)妥善設(shè)定閾值的話,能有預(yù)測價值。
AUC=0.5,跟隨機猜測一樣(例:丟銅板),模型沒有預(yù)測價值。
AUC<0.5,比隨機猜測還差;但只要總是反預(yù)測而行,就優(yōu)于隨機猜測,因此不存在 AUC<0.5 的情況。
最終AUC的范圍在[0.5, 1]之間,并且越接近1越好
5.2.4 AUC計算API
from sklearn.metrics import roc_auc_score
sklearn.metrics.roc_auc_score(y_true, y_score)
計算ROC曲線面積,即AUC值
y_true:每個樣本的真實類別,必須為0(反例),1(正例)標(biāo)記
y_score:每個樣本預(yù)測的概率值
0.5~1之間,越接近于1約好
y_test = np.where(y_test > 2.5, 1, 0)
print(“AUC指標(biāo):”, roc_auc_score(y_test, lr.predict(x_test)))
5.2.5、總結(jié)
AUC只能用來評價二分類
AUC非常適合評價樣本不平衡中的分類器性能
AUC會比較預(yù)測出來的概率,而不僅僅是標(biāo)簽類
6、Scikit-learn的算法實現(xiàn)總結(jié)
scikit-learn把梯度下降求解的單獨分開,叫SGDclassifier和SGDRegressor,他們的損失都是分類和回歸對應(yīng)的損失,比如分類:有l(wèi)og loss, 和 hingle loss(SVM)的,回歸如:比如 均方誤差, 其它的API是一樣的損失,求解并不是用梯度下降的,所以一般大規(guī)模的數(shù)據(jù)都是用scikit-learn其中SGD的方式求解
模型保存和加載
學(xué)習(xí)目標(biāo)
目標(biāo)
應(yīng)用joblib實現(xiàn)模型的保存與加載
應(yīng)用
無
當(dāng)訓(xùn)練或者計算好一個模型之后,那么如果別人需要我們提供結(jié)果預(yù)測,就需要保存模型(主要是保存算法的參數(shù))
1、sklearn模型的保存和加載API
from sklearn.externals import joblib
保存:joblib.dump(rf, ‘test.pkl’)
加載:estimator = joblib.load(‘test.pkl’)
2、線性回歸的模型保存加載案例
保存
使用線性模型進行預(yù)測
使用正規(guī)方程求解
lr = LinearRegression()
此時在干什么?
lr.fit(x_train, y_train)
保存訓(xùn)練完結(jié)束的模型
joblib.dump(lr, “test.pkl”)
加載
通過已有的模型去預(yù)測房價
model = joblib.load(“test.pkl”)
print(“從文件加載進來的模型預(yù)測房價的結(jié)果:”, std_y.inverse_transform(model.predict(x_test)))
無監(jiān)督學(xué)習(xí)-K-means算法
學(xué)習(xí)目標(biāo)
目標(biāo)
說明K-means算法原理
說明K-means的性能評估標(biāo)準(zhǔn)輪廓系數(shù)
說明K-means的優(yōu)缺點
應(yīng)用
instacart用戶聚類
回憶非監(jiān)督學(xué)習(xí)的特點?
1、 什么是無監(jiān)督學(xué)習(xí)
人員聚類
一家廣告平臺需要根據(jù)相似的人口學(xué)特征和購買習(xí)慣將美國人口分成不同的小組,以便廣告客戶可以通過有關(guān)聯(lián)的廣告接觸到他們的目標(biāo)客戶。
Airbnb 需要將自己的房屋清單分組成不同的社區(qū),以便用戶能更輕松地查閱這些清單。
一個數(shù)據(jù)科學(xué)團隊需要降低一個大型數(shù)據(jù)集的維度的數(shù)量,以便簡化建模和降低文件大小。
我們可以怎樣最有用地對其進行歸納和分組?我們可以怎樣以一種壓縮格式有效地表征數(shù)據(jù)?這都是無監(jiān)督學(xué)習(xí)的目標(biāo),之所以稱之為無監(jiān)督,是因為這是從無標(biāo)簽的數(shù)據(jù)開始學(xué)習(xí)的。
2、 無監(jiān)督學(xué)習(xí)包含算法
聚類
K-means(K均值聚類)
降維
PCA
3、 K-means原理
我們先來看一下一個K-means的聚類效果圖
K-means如何聚類效果
3.1 K-means聚類步驟
1、隨機設(shè)置K個特征空間內(nèi)的點作為初始的聚類中心
2、對于其他每個點計算到K個中心的距離,未知的點選擇最近的一個聚類中心點作為標(biāo)記類別
3、接著對著標(biāo)記的聚類中心之后,重新計算出每個聚類的新中心點(平均值)
4、如果計算得出的新中心點與原中心點一樣,那么結(jié)束,否則重新進行第二步過程
我們以一張圖來解釋效果
K-means過程分析
4、K-meansAPI
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
k-means聚類
n_clusters:開始的聚類中心數(shù)量
init:初始化方法,默認(rèn)為’k-means ++’
labels_:默認(rèn)標(biāo)記的類型,可以和真實值比較(不是值比較)
5、 案例:k-means對Instacart Market用戶聚類
5.1 分析
1、降維之后的數(shù)據(jù)
2、k-means聚類
3、聚類結(jié)果顯示
5.2 代碼
取500個用戶進行測試
cust = data[:500]
km = KMeans(n_clusters=4)
km.fit(cust)
pre = km.predict(cust)
問題:如何去評估聚類的效果呢?
6、Kmeans性能評估指標(biāo)
6.1 輪廓系數(shù)
輪廓系數(shù)公式
注:對于每個點i 為已聚類數(shù)據(jù)中的樣本 ,b_i 為i 到其它族群的所有樣本的距離最小值,a_i 為i 到本身簇的距離平均值。最終計算出所有的樣本點的輪廓系數(shù)平均值
6.2 輪廓系數(shù)值分析
分析過程(我們以一個藍(lán)1點為例)
1、計算出藍(lán)1離本身族群所有點的距離的平均值a_i
2、藍(lán)1到其它兩個族群的距離計算出平均值紅平均,綠平均,取最小的那個距離作為b_i
根據(jù)公式:極端值考慮:如果b_i >>a_i: 那么公式結(jié)果趨近于1;如果a_i>>>b_i: 那么公式結(jié)果趨近于-1
6.3 結(jié)論
如果b_i>>a_i:趨近于1效果越好, b_i<<a_i:趨近于-1,效果不好。輪廓系數(shù)的值是介于 [-1,1] ,越趨近于1代表內(nèi)聚度和分離度都相對較優(yōu)。
6.4 輪廓系數(shù)API
sklearn.metrics.silhouette_score(X, labels)
計算所有樣本的平均輪廓系數(shù)
X:特征值
labels:被聚類標(biāo)記的目標(biāo)值
6.5 用戶聚類結(jié)果評估
silhouette_score(cust, pre)
7、K-means總結(jié)
特點分析:采用迭代式算法,直觀易懂并且非常實用
缺點:容易收斂到局部最優(yōu)解(多次聚類)
注意:聚類一般做在分類之前
總結(jié)
- 上一篇: Python 装饰器初探
- 下一篇: 【光学】基于matlab色散曲线拟合【含