分類(lèi)算法的目標(biāo)值是離散型的
如果目標(biāo)值是連續(xù)型的值嵌赠,就需要回歸算法
比如房?jī)r(jià)預(yù)測(cè)塑荒、銷(xiāo)售額預(yù)測(cè)、貸款額度預(yù)測(cè)等
回歸算法-線(xiàn)性回歸分析
舉個(gè)栗子
期末成績(jī):0.7×考試成績(jī)+0.3×平時(shí)成績(jī)(各個(gè)特征跟某個(gè)值組合在一起去預(yù)測(cè))
西瓜好壞:0.2×色澤+0.5×根蒂+0.3×敲聲(把回歸問(wèn)題轉(zhuǎn)換為分類(lèi)問(wèn)題)
線(xiàn)性關(guān)系模型
一個(gè)通過(guò)屬性的線(xiàn)性組合來(lái)進(jìn)行預(yù)測(cè)的函數(shù):
線(xiàn)性回歸
定義:線(xiàn)性回歸通過(guò)一個(gè)或者多個(gè)自變量與因變量之間之間進(jìn)行建模的回歸分析。其中特點(diǎn)為一個(gè)或多個(gè)稱(chēng)為回歸系數(shù)的模型參數(shù)的線(xiàn)性組合
一元線(xiàn)性回歸:涉及到的變量只有一個(gè)
多元線(xiàn)性回歸:涉及到的變量?jī)蓚€(gè)或兩個(gè)以上
通用公式:
其中w,x為矩陣:
屬性和權(quán)重的一種組合來(lái)預(yù)測(cè)結(jié)果
矩陣也是大多數(shù)算法的計(jì)算基礎(chǔ)
矩陣乘法:
(這線(xiàn)性代數(shù)我是記不住咯…)
預(yù)測(cè)結(jié)果與真實(shí)值是有一定的誤差
單變量:
多變量:
回歸算法是迭代的算法
損失函數(shù)(誤差大小)
- y_i為第i個(gè)訓(xùn)練樣本的真實(shí)值
- h_w (x_i)為第i個(gè)訓(xùn)練樣本特征值組合預(yù)測(cè)函數(shù)
總損失定義:
又稱(chēng)最小二乘法
如何去求模型當(dāng)中的W炊豪,使得損失最辛杌?(目的是找到最小損失對(duì)應(yīng)的W值)
最小二乘法之正規(guī)方程
求解:
??為特征值矩陣词渤,??為目標(biāo)值矩陣
缺點(diǎn):當(dāng)特征過(guò)于復(fù)雜牵舱,求解速度太慢
對(duì)于復(fù)雜的算法,不能使用正規(guī)方程求解(邏輯回歸等)
損失函數(shù)直觀(guān)圖(單變量舉例)
直接求解到最小值
最小二乘法之梯度下降
我們以單變量中的w0,w1為例子:
理解:沿著這個(gè)函數(shù)下降的方向找,最后就能找到山谷的最低點(diǎn),然后更新W值
使用:面對(duì)訓(xùn)練數(shù)據(jù)規(guī)模十分龐大的任務(wù)
sklearn線(xiàn)性回歸正規(guī)方程慧妄、梯度下降A(chǔ)PI
正規(guī)方程: sklearn.linear_model.LinearRegression
梯度下降: sklearn.linear_model.SGDRegressor
LinearRegression顷牌、SGDRegressor
普通最小二乘線(xiàn)性回歸
- sklearn.linear_model.LinearRegression()
- coef_:回歸系數(shù)
通過(guò)使用SGD最小化線(xiàn)性模型
- sklearn.linear_model.SGDRegressor( )
- coef_:回歸系數(shù)
波士頓房?jī)r(jià)數(shù)據(jù)案例分析流程
波士頓地區(qū)房?jī)r(jià)數(shù)據(jù)獲取
波士頓地區(qū)房?jī)r(jià)數(shù)據(jù)分割
訓(xùn)練與測(cè)試數(shù)據(jù)標(biāo)準(zhǔn)化處理
使用最簡(jiǎn)單的線(xiàn)性回歸模型LinearRegression和梯度下降估計(jì)SGDRegressor對(duì)房?jī)r(jià)進(jìn)行預(yù)測(cè)
屬性名 | 解釋 | 類(lèi)型 |
---|---|---|
CRIM | 城鎮(zhèn)人均犯罪率 | 連續(xù)值 |
ZN | 住宅用地超過(guò) 25000 sq.ft. 的比例 | 連續(xù)值 |
INDUS | 城鎮(zhèn)非零售商用土地的比例 | 連續(xù)值 |
CHAS | 查理斯河空變量(如果邊界是河流, 則為1; 否則為0) | 離散值 |
NOX | 一氧化氮濃度 | 連續(xù)值 |
RM | 住宅平均房間數(shù) | 連續(xù)值 |
AGE | 1940 年之前建成的自用房屋比例 | 連續(xù)值 |
DIS | 到波士頓五個(gè)中心區(qū)域的加權(quán)距離 | 連續(xù)值 |
RAD | 輻射性公路的接近指數(shù) | 連續(xù)值 |
TAX | 每 10000 美元的全值財(cái)產(chǎn)稅率 | 連續(xù)值 |
PTRATIO | 城鎮(zhèn)師生比例 | 連續(xù)值 |
B | 1000(Bk-0.63)^ 2,其中 Bk 指代城鎮(zhèn)中黑人的比例 | 連續(xù)值 |
LSTAT | 人口中地位低下者的比例 | 連續(xù)值 |
這個(gè)數(shù)據(jù)集一共有13個(gè)特征塞淹,所以我們需要求出13個(gè)權(quán)重
正規(guī)方程
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
"""
線(xiàn)性回歸直接預(yù)測(cè)房子價(jià)格
:return: None
"""
# 獲取數(shù)據(jù)
lb = load_boston()
# 分割數(shù)據(jù)集到訓(xùn)練集和測(cè)試集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 進(jìn)行標(biāo)準(zhǔn)化處理(目標(biāo)值要進(jìn)行標(biāo)準(zhǔn)化處理)
# 特征值和目標(biāo)值都必須進(jìn)行標(biāo)準(zhǔn)化處理, 實(shí)例化兩個(gè)標(biāo)準(zhǔn)化API
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目標(biāo)值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# estimator預(yù)測(cè)
# 正規(guī)方程求解方式預(yù)測(cè)結(jié)果
lr = LinearRegression()
lr.fit(x_train, y_train)
print(lr.coef_)
# 預(yù)測(cè)測(cè)試集的房子價(jià)格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正規(guī)方程測(cè)試集里面每個(gè)房子的預(yù)測(cè)價(jià)格: ", y_lr_predict)
print("正規(guī)方程的均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
if __name__ == "__main__":
mylinear()
梯度下降
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
"""
線(xiàn)性回歸直接預(yù)測(cè)房子價(jià)格
:return: None
"""
# 獲取數(shù)據(jù)
lb = load_boston()
# 分割數(shù)據(jù)集到訓(xùn)練集和測(cè)試集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 進(jìn)行標(biāo)準(zhǔn)化處理(目標(biāo)值要進(jìn)行標(biāo)準(zhǔn)化處理)
# 特征值和目標(biāo)值都必須進(jìn)行標(biāo)準(zhǔn)化處理, 實(shí)例化兩個(gè)標(biāo)準(zhǔn)化API
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目標(biāo)值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# estimator預(yù)測(cè)
# 梯度下降進(jìn)行房?jī)r(jià)預(yù)測(cè)
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 預(yù)測(cè)測(cè)試集的房子價(jià)格
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("梯度下降測(cè)試集里面每個(gè)房子的預(yù)測(cè)價(jià)格: ", y_sgd_predict)
print("梯度下降的均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
if __name__ == "__main__":
mylinear()
回歸性能評(píng)估
(均方誤差(Mean Squared Error)MSE) 評(píng)價(jià)機(jī)制:
這個(gè)非常簡(jiǎn)單,就是你的預(yù)測(cè)值和真實(shí)值之間的差值的平方和求一個(gè)平均值
sklearn回歸評(píng)估API
sklearn.metrics.mean_squared_error
mean_squared_error
mean_squared_error(y_true, y_pred)
- 均方誤差回歸損失
- y_true:真實(shí)值
- y_pred:預(yù)測(cè)值
- return:浮點(diǎn)數(shù)結(jié)果
注:真實(shí)值窖铡,預(yù)測(cè)值為標(biāo)準(zhǔn)化之前的值
官方給我們的一些建議
正規(guī)方程與梯度下降的對(duì)比
梯度下降 | 正規(guī)方程 |
---|---|
需要選擇學(xué)習(xí)率α | 不需要 |
需要多次迭代 | 一次運(yùn)算得出 |
當(dāng)特征數(shù)量n大時(shí)也能較好適用 | 需要計(jì)算(XTX)-1<br />如果特征數(shù)量n較大則運(yùn)算代價(jià)大疗锐,因?yàn)榫仃嚹娴挠?jì)算時(shí)間復(fù)雜度為O(n^3),通常來(lái)說(shuō)當(dāng)n小于10000時(shí)還是可以接受的 |
適用于各種類(lèi)型的模型 | 只適用于線(xiàn)性模型费彼,不適合邏輯回歸模型等其他模型 |
線(xiàn)性回歸器是最為簡(jiǎn)單滑臊、易用的回歸模型。
從某種程度上限制了使用箍铲,盡管如此雇卷,在不知道特征之間關(guān)系的前提下,我們?nèi)匀皇褂镁€(xiàn)性回歸器作為大多數(shù)系統(tǒng)的首要選擇颠猴。
- 小規(guī)模數(shù)據(jù):LinearRegression(不能解決擬合問(wèn)題)以及其它
- 大規(guī)模數(shù)據(jù):SGDRegressor
過(guò)擬合與欠擬合
問(wèn)題:訓(xùn)練數(shù)據(jù)訓(xùn)練的很好啊关划,誤差也不大,為什么在測(cè)試集上面有問(wèn)題呢翘瓮?
分析圖1:
經(jīng)過(guò)訓(xùn)練后贮折,知道了天鵝是有翅膀的,天鵝的嘴巴是長(zhǎng)長(zhǎng)的资盅。簡(jiǎn)單的認(rèn)為有這些特征的都是天鵝调榄。因?yàn)闄C(jī)器學(xué)習(xí)到的天鵝特征太少了,導(dǎo)致區(qū)分標(biāo)準(zhǔn)太粗糙呵扛,不能準(zhǔn)確識(shí)別出天鵝每庆。
分析圖2:
機(jī)器通過(guò)這些圖片來(lái)學(xué)習(xí)天鵝的特征,經(jīng)過(guò)訓(xùn)練后今穿,知道了天鵝是有翅膀的缤灵,天鵝的嘴巴是長(zhǎng)長(zhǎng)的彎曲的,天鵝的脖子是長(zhǎng)長(zhǎng)的有點(diǎn)曲度蓝晒,天鵝的整個(gè)體型像一個(gè)"2"且略大于鴨子腮出。這時(shí)候機(jī)器已經(jīng)基本能區(qū)別天鵝和其他動(dòng)物了。然后拔创,很不巧已有的天鵝圖片全是白天鵝的利诺,于是機(jī)器經(jīng)過(guò)學(xué)習(xí)后,會(huì)認(rèn)為天鵝的羽毛都是白的剩燥,以后看到羽毛是黑的天鵝就會(huì)認(rèn)為那不是天鵝慢逾。
過(guò)擬合與欠擬合
過(guò)擬合:一個(gè)假設(shè)在訓(xùn)練數(shù)據(jù)上能夠獲得比其他假設(shè)更好的擬合立倍, 但是在訓(xùn)練數(shù)據(jù)外的數(shù)據(jù)集上卻不能很好地?cái)M合數(shù)據(jù),此時(shí)認(rèn)為這個(gè)假設(shè)出現(xiàn)了過(guò)擬合的現(xiàn)象侣滩。(模型過(guò)于復(fù)雜)
欠擬合:一個(gè)假設(shè)在訓(xùn)練數(shù)據(jù)上不能獲得更好的擬合口注, 但是在訓(xùn)練數(shù)據(jù)外的數(shù)據(jù)集上也不能很好地?cái)M合數(shù)據(jù),此時(shí)認(rèn)為這個(gè)假設(shè)出現(xiàn)了欠擬合的現(xiàn)象君珠。(模型過(guò)于簡(jiǎn)單)
對(duì)線(xiàn)性模型進(jìn)行訓(xùn)練學(xué)習(xí)會(huì)變成復(fù)雜模型
欠擬合原因以及解決辦法
- 原因:學(xué)習(xí)到數(shù)據(jù)的特征過(guò)少
- 解決辦法:增加數(shù)據(jù)的特征數(shù)量
過(guò)擬合原因以及解決辦法
原因:原始特征過(guò)多寝志,存在一些嘈雜特征, 模型過(guò)于復(fù)雜是因?yàn)槟P蛧L試去兼顧各個(gè)測(cè)試數(shù)據(jù)點(diǎn)策添,數(shù)據(jù)的特征和目標(biāo)值之間不僅僅是線(xiàn)性關(guān)系
-
解決辦法:
- 進(jìn)行特征選擇材部,消除關(guān)聯(lián)性大的特征(很難做)
- 交叉驗(yàn)證(讓所有數(shù)據(jù)都有過(guò)訓(xùn)練)
- 正則化
回憶一下特征選擇方法:
- 過(guò)濾式:低方差特征
- 嵌入式:正則化,決策樹(shù)唯竹,神經(jīng)網(wǎng)絡(luò)
L2正則化
作用:可以使得W的每個(gè)元素都很小乐导,都接近于0
優(yōu)點(diǎn):越小的參數(shù)說(shuō)明模型越簡(jiǎn)單,越簡(jiǎn)單的模型則越不容易產(chǎn)生過(guò)擬合現(xiàn)象
線(xiàn)性回歸:LinearRegression 容易出現(xiàn)過(guò)擬合浸颓,為了把訓(xùn)練接數(shù)據(jù)表現(xiàn)更好
L2正則化:Ridge:嶺回歸 帶有正則化的線(xiàn)性回歸 解決過(guò)擬合
嶺回歸
帶有正則化的線(xiàn)性回歸-Ridge
sklearn.linear_model.Ridge
Ridge
具有l(wèi)2正則化的線(xiàn)性最小二乘法
- sklearn.linear_model.Ridge(alpha=1.0)
- alpha:正則化力度
- coef_:回歸系數(shù)
觀(guān)察正則化程度的變化物臂,對(duì)結(jié)果的影響
正則化力度越來(lái)越大,模型越來(lái)越簡(jiǎn)單
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
"""
線(xiàn)性回歸直接預(yù)測(cè)房子價(jià)格
:return: None
"""
# 獲取數(shù)據(jù)
lb = load_boston()
# 分割數(shù)據(jù)集到訓(xùn)練集和測(cè)試集
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
# 進(jìn)行標(biāo)準(zhǔn)化處理(目標(biāo)值要進(jìn)行標(biāo)準(zhǔn)化處理)
# 特征值和目標(biāo)值都必須進(jìn)行標(biāo)準(zhǔn)化處理, 實(shí)例化兩個(gè)標(biāo)準(zhǔn)化API
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
# 目標(biāo)值
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1, 1))
y_test = std_y.transform(y_test.reshape(-1, 1))
# estimator預(yù)測(cè)
# 嶺回歸去進(jìn)行房?jī)r(jià)預(yù)測(cè)
rd = Ridge(alpha=1.0)
rd.fit(x_train, y_train)
print(rd.coef_)
# 預(yù)測(cè)測(cè)試集的房子價(jià)格
y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
print("嶺回歸測(cè)試集里面每個(gè)房子的預(yù)測(cè)價(jià)格: ", y_rd_predict)
print("嶺回歸的均方誤差: ", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
if __name__ == "__main__":
mylinear()
線(xiàn)性回歸 LinearRegression與Ridge對(duì)比
嶺回歸:回歸得到的回歸系數(shù)更符合實(shí)際产上,更可靠棵磷。另外,能讓估計(jì)參數(shù)的波動(dòng)范圍變小晋涣,變的更穩(wěn)定仪媒。在存在病態(tài)數(shù)據(jù)偏多的研究中有較大的實(shí)用價(jià)值。
模型的保存與加載
import joblib
保存:joblib.dump(rf, 'test.pkl')
加載:estimator = joblib.load('test.pkl')
注:文件格式pkl
分類(lèi)算法-邏輯回歸
他叫邏輯回歸…可他是分類(lèi)算法
邏輯回歸:線(xiàn)性回歸的式子作為邏輯回歸的輸入谢鹊,適用于二分類(lèi)場(chǎng)景规丽,他也能得出概率值
- 廣告點(diǎn)擊率
- 判斷用戶(hù)的性別
- 預(yù)測(cè)用戶(hù)是否會(huì)購(gòu)買(mǎi)給定的商品類(lèi)
- 判斷一條評(píng)論是正面的還是負(fù)面的
邏輯回歸是解決二分類(lèi)問(wèn)題的利器
邏輯回歸
輸入:
sigmoid函數(shù)
邏輯回歸的輸入-sigmoid→分類(lèi)
sigmodid函數(shù)會(huì)把值映射到[0, 1],也就是把我們的輸入值轉(zhuǎn)換成一個(gè)概率值
邏輯回歸公式
公式:
輸出:[0,1]區(qū)間的概率值撇贺,默認(rèn)0.5作為閥值
注:g(z)為sigmoid函數(shù)
邏輯回歸的損失函數(shù)、優(yōu)化
與線(xiàn)性回歸原理相同,但由于是分類(lèi)問(wèn)題冰抢,損失函數(shù)不一樣松嘶,只能通過(guò)梯度下降求解
對(duì)數(shù)似然損失函數(shù):
完整的損失函數(shù):
cost損失的值越小,那么預(yù)測(cè)的類(lèi)別準(zhǔn)確度更高
損失函數(shù):
- 均方誤差:不存在多個(gè)局部最低點(diǎn)挎扰,只有一個(gè)最小值
- 對(duì)數(shù)似然損失:多個(gè)局部最小值
對(duì)數(shù)似然損失求出來(lái)的不一定是總函數(shù)的最小值翠订,目前還是一個(gè)解決不了的問(wèn)題,但是我們可以采取一些方案去盡量改善:
- 多次隨機(jī)初始化遵倦,多次比較最小值結(jié)果
- 求解過(guò)程中尽超,調(diào)整學(xué)習(xí)率
盡管沒(méi)有全局最低點(diǎn),但是效果都是不錯(cuò)的
sklearn邏輯回歸API
sklearn.linear_model.LogisticRegression
LogisticRegression
sklearn.linear_model.LogisticRegression(penalty=‘l2’, C = 1.0)
- Logistic回歸分類(lèi)器
- coef_:回歸系數(shù)
LogisticRegression回歸案例
良/惡性乳腺癌腫瘤預(yù)測(cè)
原始數(shù)據(jù)的下載地址:
https://archive.ics.uci.edu/ml/machine-learning-databases/
數(shù)據(jù)描述
(1)699條樣本梧躺,共11列數(shù)據(jù)似谁,第一列用語(yǔ)檢索的id傲绣,后9列分別是與腫瘤相關(guān)的醫(yī)學(xué)特征,最后一列表示腫瘤類(lèi)型的數(shù)值巩踏。
(2)包含16個(gè)缺失值秃诵,用”?”標(biāo)出。
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
import joblib
import pandas as pd
import numpy as np
import ssl
def logistic():
"""
邏輯回歸做二分類(lèi)進(jìn)行癌癥預(yù)測(cè)(根據(jù)細(xì)胞的屬性特征)
:return: None
"""
ssl._create_default_https_context = ssl._create_unverified_context
# 構(gòu)造列標(biāo)簽名字
column = ['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']
# 讀取數(shù)據(jù)
data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)
print(data)
# 缺失值進(jìn)行處理
data = data.replace(to_replace='?', value=np.nan)
data = data.dropna()
# 進(jìn)行數(shù)據(jù)的分割
x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)
# 進(jìn)行標(biāo)準(zhǔn)化處理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 邏輯回歸預(yù)測(cè)
lg = LogisticRegression(C=1.0)
lg.fit(x_train, y_train)
print(lg.coef_)
y_predict = lg.predict(x_test)
print("準(zhǔn)確率:", lg.score(x_test, y_test))
print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "惡性"]))
return None
if __name__ == "__main__":
logistic()
運(yùn)行結(jié)果
Sample code number Clump Thickness ... Mitoses Class
0 1000025 5 ... 1 2
1 1002945 5 ... 1 2
2 1015425 3 ... 1 2
3 1016277 6 ... 1 2
4 1017023 4 ... 1 2
.. ... ... ... ... ...
694 776715 3 ... 1 2
695 841769 2 ... 1 2
696 888820 5 ... 2 4
697 897471 4 ... 1 4
698 897471 4 ... 1 4
[699 rows x 11 columns]
[[1.30052154 0.14422948 0.87413413 1.00049744 0.13566855 1.20200872
0.95905237 0.61479529 0.74051181]]
準(zhǔn)確率: 0.9766081871345029
召回率: precision recall f1-score support
良性 0.98 0.98 0.98 123
惡性 0.96 0.96 0.96 48
accuracy 0.98 171
macro avg 0.97 0.97 0.97 171
weighted avg 0.98 0.98 0.98 171
LogisticRegression總結(jié)
應(yīng)用:廣告點(diǎn)擊率預(yù)測(cè)塞琼、電商購(gòu)物搭配推薦
優(yōu)點(diǎn):適合需要得到一個(gè)分類(lèi)概率的場(chǎng)景
缺點(diǎn):當(dāng)特征空間很大時(shí)菠净,邏輯回歸的性能不是很好(看硬件能力)
生成模型和判別模型
先驗(yàn)概率:從歷史的數(shù)據(jù)中總結(jié)出概率信息。
需要進(jìn)行先驗(yàn)概率的模型就是生成模型彪杉。
判別模型:k-近鄰毅往,決策樹(shù),隨機(jī)森林派近,神經(jīng)網(wǎng)絡(luò)
生成模型:樸素貝葉斯攀唯,隱馬爾可夫模型
邏輯回歸 | 樸素貝葉斯 | |
---|---|---|
解決問(wèn)題 | 二分類(lèi) | 多分類(lèi) |
應(yīng)用場(chǎng)景 | 二分類(lèi)需要概率的問(wèn)題 | 文本分類(lèi) |
參數(shù) | 正則化力度 | 沒(méi)有 |
得出的結(jié)果都有概率解釋
非監(jiān)督學(xué)習(xí)
- 隨機(jī)在數(shù)據(jù)當(dāng)中抽取三個(gè)樣本构哺,當(dāng)作三個(gè)類(lèi)別的中心點(diǎn)(k1, k2, k3)
- 計(jì)算其余的點(diǎn)分別到這三個(gè)中心店的距離革答,每一個(gè)樣本有三個(gè)距離(a, b, c),從中選出距離最近的一個(gè)點(diǎn)作為自己的標(biāo)記形成三個(gè)族群曙强。
- 分別計(jì)算這三個(gè)族群的平均值残拐,把三個(gè)平均值與之前的三個(gè)舊中心點(diǎn)進(jìn)行比較,如果相同:結(jié)束聚類(lèi)碟嘴。如果不相同:把這三個(gè)平均值當(dāng)作新的中心點(diǎn)溪食,重復(fù)第二步。
k-means步驟
- 隨機(jī)設(shè)置K個(gè)特征空間內(nèi)的點(diǎn)作為初始的聚類(lèi)中心
- 對(duì)于其他每個(gè)點(diǎn)計(jì)算到K個(gè)中心的距離娜扇,未知的點(diǎn)選擇最近的一個(gè)聚類(lèi)中心點(diǎn)作為標(biāo)記類(lèi)別
- 接著對(duì)著標(biāo)記的聚類(lèi)中心之后错沃,重新計(jì)算出每個(gè)聚類(lèi)的新中心點(diǎn)(平均值)
- 如果計(jì)算得出的新中心點(diǎn)與原中心點(diǎn)一樣,那么結(jié)束雀瓢,否則重新進(jìn)行第二步過(guò)程
k-means API
sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
- k-means聚類(lèi)
- n_clusters:開(kāi)始的聚類(lèi)中心數(shù)量
- init:初始化方法枢析,默認(rèn)為'k-means ++’
- labels_:默認(rèn)標(biāo)記的類(lèi)型,可以和真實(shí)值比較(不是值比較)
k-means對(duì)Instacart Market用戶(hù)聚類(lèi)
- 降維之后的數(shù)據(jù)
- k-means聚類(lèi)
- 聚類(lèi)結(jié)果顯示
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
# 讀取四張表的數(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")
# 合并四張表到一張表 (用戶(hù)-物品類(lèi)別)
_mg = pd.merge(prior, products, on=['product_id', 'product_id'])
_mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
mt = pd.merge(_mg, aisles, on=['aisle_id', 'aisle_id'])
print(mt.head(10))
# 交叉表(特殊的分組工具)
cross = pd.crosstab(mt['user_id'], mt['aisle'])
print(cross.head(10))
# 進(jìn)行主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
# 把樣本數(shù)量減少
x = data[:500]
print(x.shape)
# 假設(shè)用戶(hù)一共分為四個(gè)類(lèi)別
km = KMeans(n_clusters=4)
km.fit(x)
predict = km.predict(x)
print(predict)
# 顯示聚類(lèi)的結(jié)果
plt.figure(figsize=(10,10))
# 建立四個(gè)顏色的列表
colored = ['orange', 'green', 'blue', 'purple']
colr = [colored[i] for i in predict]
plt.scatter(x[:, 1], x[:, 20], color=colr)
plt.xlabel("1")
plt.ylabel("20")
plt.show()
# 評(píng)判聚類(lèi)效果刃麸,輪廓系數(shù)
print(silhouette_score(x, predict))
運(yùn)行結(jié)果
order_id product_id ... days_since_prior_order aisle
0 2 33120 ... 8.0 eggs
1 26 33120 ... 7.0 eggs
2 120 33120 ... 10.0 eggs
3 327 33120 ... 8.0 eggs
4 390 33120 ... 9.0 eggs
5 537 33120 ... 3.0 eggs
6 582 33120 ... 10.0 eggs
7 608 33120 ... 12.0 eggs
8 623 33120 ... 3.0 eggs
9 689 33120 ... 3.0 eggs
[10 rows x 14 columns]
aisle air fresheners candles asian foods ... white wines yogurt
user_id ...
1 0 0 ... 0 1
2 0 3 ... 0 42
3 0 0 ... 0 0
4 0 0 ... 0 0
5 0 2 ... 0 3
6 0 0 ... 0 0
7 0 0 ... 0 5
8 0 1 ... 0 0
9 0 0 ... 0 19
10 0 1 ... 0 2
[10 rows x 134 columns]
(500, 27)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0
2 0 0 0 0 0 0 0 0 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 2 0 0
0 0 0 1 2 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 2 0 0 0 0 0 3 0 0 0 2 0 0 0 0 0 0 0 0
1 0 0 0 2 0 0 0 0 2 2 2 0 2 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 2 0 0 0 0 0 0 0 3 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 3 0 0 0 0 0 0 0 2 0 1 0 0 0 2 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 3 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 3
0 0 0 2 0 0 0 2 0 2 0 0 0 0 0 0 0 1 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
0 0 0 0 2 2 0 0 0 0 0 0 0 0 2 0 0 0 0]
0.6123125240469242
Kmeans性能評(píng)估指標(biāo)
輪廓系數(shù):
注:對(duì)于每個(gè)點(diǎn)i 為已聚類(lèi)數(shù)據(jù)中的樣本 醒叁,b_i 為i 到其它族群的所有樣本的平均距離,a_i 為i 到本身簇的距離平均值
最終計(jì)算出所有的樣本點(diǎn)的輪廓系數(shù)平均值
如果sc_i 小于0泊业,說(shuō)明a_i 的平均距離大于最近的其他簇把沼。聚類(lèi)效果不好
如果sc_i 越大,說(shuō)明a_i 的平均距離小于最近的其他簇吁伺。聚類(lèi)效果好
輪廓系數(shù)的值是介于 [-1,1] 饮睬,越趨近于1代表內(nèi)聚度和分離度都相對(duì)較優(yōu)
對(duì)于每一個(gè)樣本 這里以藍(lán)1為例
計(jì)算藍(lán)1到自身類(lèi)別的點(diǎn)距離的平均值a_i
計(jì)算藍(lán)1分別到紅色類(lèi)別,綠色類(lèi)別所有的點(diǎn)的距離篮奄,求出平均值b1, b2捆愁,取其中最小的值當(dāng)做b_i
用公式計(jì)算藍(lán)1的輪廓系數(shù)[-1, 1]
極端情況:
b_i>>a_i: 1 完美
a_i>> b_i: -1 最差
Kmeans性能評(píng)估指標(biāo)API
sklearn.metrics.silhouette_score(X, labels)
- 計(jì)算所有樣本的平均輪廓系數(shù)
- X:特征值
- labels:被聚類(lèi)標(biāo)記的目標(biāo)值
特點(diǎn)分析:采用迭代式算法割去,直觀(guān)易懂并且非常實(shí)用
缺點(diǎn):容易收斂到局部最優(yōu)解(多次聚類(lèi))
需要預(yù)先設(shè)定簇的數(shù)量(k-means++解決)
"日出于東,落于西牙瓢。登高棄梯劫拗,未來(lái)可期。"
Macsen Chu