Data Analysis
算法基礎(chǔ), 工具框架算法模型的選擇使用, 業(yè)務(wù)方面(金融等)
需要掌握 算法推導(dǎo)過(guò)程
了解大數(shù)據(jù)系統(tǒng) (架構(gòu)層, 算法是核心層)
數(shù)據(jù)獲取途徑: 爬蟲(chóng), 大數(shù)據(jù)架構(gòu), 購(gòu)買
數(shù)據(jù)挖掘(numpy, pandas, matplotlib ... ...)----
圖像識(shí)別(在物聯(lián)網(wǎng)中的應(yīng)用, 無(wú)人駕駛技術(shù), 自動(dòng)泊車) nlp
numpy
核心數(shù)據(jù)結(jié)構(gòu)是數(shù)組(二維以上就是矩陣, 一維數(shù)組是行向量)
- 創(chuàng)建
(1) list創(chuàng)建
? copy列表, 把列表中的元素類型統(tǒng)一化(object > float > int > boolean)然后根據(jù)統(tǒng)一化以后列表創(chuàng)建數(shù)組對(duì)象(數(shù)組中的元素類型都一致)
? 列表在雙肩數(shù)組的時(shí)候需要每個(gè)維度上的元素個(gè)數(shù)保持一致
(2) 內(nèi)建函數(shù)
? ones()
? zeros()
? full()
? eye() 對(duì)角線上為1 其他為0
? linspace(start, stop, num=50)
? logspace(start, stop, num=50) 指數(shù) 1 - 10
? arange(start, stop, step) 去下標(biāo)
? random.randint(low, hight, size)
? random.randn() 標(biāo)準(zhǔn)正態(tài)分布
? random.narmal() 正態(tài)分布
? random.random() 0 - 1 隨機(jī)浮點(diǎn)數(shù) - 屬性
ndim 維度
size 大小
shape 形狀
dtype 數(shù)據(jù)類型
itemsize 每個(gè)元素的字節(jié)數(shù) (float雙精度的浮點(diǎn)64位 8個(gè)字節(jié), 布爾類型一個(gè)字節(jié))
data 內(nèi)存地址 - ndarray的基本操作
- 索引
所有的列表索引方式, 數(shù)組都使用a = np.array([[1, 2, 3], [4, 5, 6]])
列表索引方式a[0][0]
數(shù)組特有的索引方式a[0, 1]或a[[1, 0, 1]] - 切片
a[起始 : 終止 : 步長(zhǎng)]
步長(zhǎng)為正: 從前向后切,
步長(zhǎng)為負(fù): 從后向前切, - 變形
- 變形前后size值保持一致
-
reshape(size=())把原來(lái)的數(shù)組copy出一個(gè)副本對(duì)副本進(jìn)行變形并返回 -
resize(size=())直接在原數(shù)組上進(jìn)行變形
- 級(jí)聯(lián)
- 維度一致才能級(jí)聯(lián)
- 形狀相符才能級(jí)聯(lián)(將axis的取值所在維度蓋住看其他維度是否形狀一致)
- axis 指定級(jí)聯(lián)的方向
針對(duì)于矩陣還有hstack()和vsrack()
h是把二維數(shù)組變成一維(行向量)
v是把一維數(shù)組變成 n 行 1 列的二維數(shù)組(列向量)
- 切分
split(數(shù)組, [切分點(diǎn), ... ...], axis=0 )
vsplit縱向上切 切的是0維度
hspilt橫向上切 切的是1維度
- 索引
- 矩陣運(yùn)算
- 矩陣與矩陣
+-(兩個(gè)矩陣之間形狀size要一致) - 矩陣與矩陣乘
np.dot()矩陣乘分為點(diǎn)乘(內(nèi)積)和叉乘(外積) - 矩陣與常數(shù)
*/ - 廣播機(jī)制原則
- 當(dāng)向量或者常數(shù)與矩陣進(jìn)行運(yùn)算的時(shí)候, 可以把向量或者常數(shù)補(bǔ)全成矩陣的形狀
- 我們可以把一個(gè)常數(shù)按照任何一個(gè)矩陣的形狀進(jìn)行擴(kuò)充
- 向量和矩陣相加減(要求: 如果是行向量那么元素的個(gè)數(shù)要和矩陣的列數(shù)一致, 因?yàn)榘葱袛U(kuò)充)(如果是列向量, 那么行數(shù)要和矩陣的行數(shù)一致, 按列擴(kuò)充), 根據(jù)行數(shù)或者列數(shù)把向量進(jìn)行擴(kuò)充
- 矩陣與矩陣
- 數(shù)組的聚合
- 完全聚合: 不指定 axis 的值, 則把所有的數(shù)據(jù)聚合在一起
- 聚合時(shí)將
np.nan剔除 - 指定軸聚合: 用 axis 來(lái)指定對(duì)哪些維度進(jìn)行聚合
- axis 值等于哪個(gè)維度, 這個(gè)維度就會(huì)消失, 取而代之的是把這個(gè)維度上的子元素進(jìn)行某種聚合的結(jié)果
pandas
Series、 DataFrame、 Pannel
- Series
構(gòu)成: index 和 values
# 字典是 哈希結(jié)構(gòu)(散列結(jié)構(gòu)), 數(shù)組是線性結(jié)構(gòu)
# 字典的查找(哈希算法找)效率比數(shù)組的查找(先找到首元素再根據(jù)下標(biāo))效率快,</pre>
series在查找的時(shí)候既可以用下標(biāo)(隱式索引)來(lái)查找又可以用 index(顯式索引)來(lái)查找
- 創(chuàng)建
- 用數(shù)組或者列表來(lái)創(chuàng)建
創(chuàng)建的時(shí)候要指定 values 部分對(duì)應(yīng)的內(nèi)容和 index 部分對(duì)應(yīng)的內(nèi)容, values就是數(shù)組或列表種具體的值, index 的值如果不指定, 默認(rèn)會(huì)把數(shù)組的下標(biāo)設(shè)置為 index, 如果指定, 制定的時(shí)候 index 的個(gè)數(shù)和 values 的個(gè)數(shù)保持一致
s = pd.series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']) - 用字典來(lái)創(chuàng)建
系統(tǒng)會(huì)把字典的所有的值 copy 出放在 values 部分, 所有鍵 copy 出放在對(duì)應(yīng)的index部分, 字典的除了自帶的index 以外, 也可以指定 index, 這個(gè)指定的 index 可以和原字典的 index 不保持一致, 不一致的地方會(huì)設(shè)置為 nan
s = pd.series(data={'a': 1, 'b': 2, 'c': 3, 'd': 4})
- 用數(shù)組或者列表來(lái)創(chuàng)建
- 索引與切片
- 顯示索引(即用 index 作為索引)
s['a']===s.loc['a'] - 隱式索引(用values的下標(biāo)作為索引)
s.iloc[0] - 隱式切片(實(shí)質(zhì)上切實(shí)calues數(shù)組)
s.iloc[0: 2] - 顯示切片(對(duì) index 進(jìn)行切)
s.loc['a': 'c']注意: c如果重復(fù)切不連續(xù), 則不能以c為切片的斷點(diǎn)
- 顯示索引(即用 index 作為索引)
- 基本操作
- 屬性:shape, size, index, values, name
- 確實(shí)檢測(cè): isnull(), notnull()
- 擴(kuò)展: 有 seriesA 和 seriesB , A 和 B 的 index 完全一致但是 B 的 values全是boolean, 那么 B 可以作為 A 的索引使用, 此時(shí)輸出的內(nèi)容是B 中為True的那些索引對(duì)應(yīng)的內(nèi)容
- Series 的運(yùn)算
- 適合 numpy 的運(yùn)算都適合 Series
- Series 之間的運(yùn)算
索引對(duì)應(yīng)的那些元素的值進(jìn)行數(shù)學(xué)運(yùn)算, 運(yùn)算的結(jié)果還對(duì)應(yīng)相關(guān)索引
如果索引 index 不對(duì)應(yīng)情況, 將缺失的 index 補(bǔ)充 NAN 在進(jìn)行運(yùn)算
- DataFrame 數(shù)據(jù)表
結(jié)構(gòu): index、 column、 values 分別代表行索引, 列索引, 值
一個(gè)DataFrame 由多個(gè)Series構(gòu)成, 按行的話, 每一行都是一個(gè)Series, 如果按列, 每一列都是一個(gè)Series- 創(chuàng)建
- 數(shù)組: 指定index, colunms 和 values
- 字典: 每個(gè)鍵值對(duì)應(yīng)的是一列, 鍵代表這一列的列索引, 值代表這個(gè)列名下對(duì)應(yīng)的那些值
df = DataFrame({'a': [1, 2, 3, 4], 'b':[3, 4, 5, 6], 'c':[1, 5, 7, 8]})
- 索引與切片
- 索引列
列不能直接用列名進(jìn)行切片 df['a': 'c']
df['a']或df.a - 索引行
顯式df.loc['a']df.loc['a': 'c']df.loc[['a', 'b', 'c']]
隱式df.iloc[0]df.iloc[0: 2]df.iloc[[0, 1, 1]]
- 索引列
- 索引具體元素
df['a'][0]
df['a', 0] 這是錯(cuò)誤的 不允許先列后行
df.loc[0, 'a']
df.loc[::, 'a':'c']
df.iloc[::, 0: 2]
- 創(chuàng)建
- DataFrame 的運(yùn)算
- DataFrame之間的運(yùn)算
遵從自動(dòng)補(bǔ)全機(jī)制 - DataFrame 和 Series 之間的運(yùn)算
如果Series 的 index 是行索引 在運(yùn)算的時(shí)候要指定 axis 為 0,
如果 Series的 index 是列索引 在運(yùn)算的時(shí)候要指定 axis 為 1,
- DataFrame之間的運(yùn)算
- 數(shù)據(jù)的過(guò)濾與清晰
- 缺失值的處理
標(biāo)準(zhǔn)的python缺失值np.nan
檢測(cè)具體某個(gè)位置的缺失isnull()和notnull()與any()和all()配合使用- 過(guò)濾
dropna(axis=0) - 填充
fillna()用具體值填充, 向前填充, 向后填充
- 過(guò)濾
- 異常值的處理
在實(shí)際業(yè)務(wù)中規(guī)定某些范圍的值就是異常值, 處理異常值也要根據(jù)實(shí)際業(yè)務(wù)(刪除、 修正) - 重復(fù)值(行)
不是第一次出現(xiàn)的都是重復(fù)
- 缺失值的處理
- 層次化索引
- 層次化索引創(chuàng)建
- 層次化索引的查找與切片
只有暴露在最外層的索引才能直接查找與切片 - 索引堆
stack()和unstack()
stack(level = -1)level 等于哪一層次, 她就會(huì)消失出現(xiàn)在列中
unstack(level = -1)level 等于哪一層次, 她就會(huì)消失出現(xiàn)在列中
- 拼接
- 級(jí)聯(lián)
pd.concat([df1, df2], axis=0)- 簡(jiǎn)單級(jí)聯(lián)
對(duì)行級(jí)聯(lián), 列名一致 - 不匹配級(jí)聯(lián)
對(duì)行級(jí)聯(lián), 列名不一致
內(nèi)連接join='outer'(不匹配的補(bǔ)nan), 外連接join='inner'(不匹配的去掉), 指定軸鏈接join_axes=[df1.columns](只保留指定的軸)join_axes=[pd.Index(['A', 'C'])
- 簡(jiǎn)單級(jí)聯(lián)
- 合并
和并要求兩個(gè)二維表有一個(gè)或者多個(gè)公共屬性, 用公共屬性作為合并的key值進(jìn)行拼接;如果兩個(gè)表沒(méi)有公共屬性那么不能直接合并- 一對(duì)一
df1.merge(df2) - 一對(duì)多 把一個(gè)復(fù)制成多份 再合并
- 多對(duì)多 組合
如果出現(xiàn)不匹配的情況則 - 內(nèi)合并:
how='inner'不匹配的部分剃掉 - 外合并: 不匹配的地方補(bǔ)nan
- 左合并: 按左邊為基準(zhǔn)合并
- 右合并:
多個(gè)公共屬性時(shí) - 指定以某一屬性為key
df1.merge(df2, on=['name'], suffixes=['age1', 'age2'])
沒(méi)有公共屬性時(shí) df1.merge(df2, left_on=['name'], right_on=['名字'])
- 一對(duì)一
- 級(jí)聯(lián)
- 映射
在一個(gè)關(guān)系表中把某些值和特定的鍵綁定在一起構(gòu)成映射
如:
{'a': 1, 'b': 2}
y = 2 * x + 1, y = x ** 2 + 1
def func(x):
return x ** 2 # 函數(shù) 功能模塊的封裝(面向?qū)ο螅豪^承,封裝,多態(tài))
lambda x: x * 2 + 1
df1['job'][df1.job == 'driver'] = 'cooker'
替換元素 df.replace({'原來(lái)的元素': '替換的元素'})
根據(jù)已知列映射出新列 df['新的列名'] = df['已存在的列名'].map({'已存在列的元素': '映射結(jié)果'})
def func(x):
if x > 60 :
return '及格'
else:
return '不及格'
# df['是否及格'] = df['成績(jī)'].map(func)
- 分組聚合
df.groupby['color'][['price']].sum()按顏色求價(jià)格的和 - 繪圖
折線圖、 柱狀圖、 直方圖、概率密度曲線
scipy
高端科學(xué)計(jì)算工具包
- 傅里葉變換
fft()
過(guò)濾高頻信號(hào) - 微積分
integrate.qual(積分方程, 積分上限, 積分下限)
方程: y = x ** 2 在(x0, xn)的面積
x0^2dx + x1^2dx + ... ... + xn^2dx
= f(0~2)x^2dx = (1/3)x^3|0~2 = 8/3 </pre>
- 圖像處理
移動(dòng)shift()旋轉(zhuǎn)rotate()縮放zoom()
高斯濾波from scipy import ndimagendimage.gaussian_filter()
中位數(shù)濾波ndimage.median_filter()
signal維納濾波from scipy import signalsignal.wiener(moon, size=5)
matplotlib
- 圖形基礎(chǔ)
matplotlib 中基本的繪圖元素包括 坐標(biāo)軸、 坐標(biāo)軸刻度、 繪圖區(qū)域、- 2D曲線
單個(gè) plot() 參數(shù)傳一個(gè)數(shù)組或者兩個(gè)數(shù)組
多條: 用多個(gè) plot() 函數(shù)繪制 用 plot.show() 統(tǒng)一顯示 也可以plt.plot(x1, y1, x2, y2, x3, y3)
彩圖轉(zhuǎn)灰度圖 可以使用 聚合, rgb加權(quán) - 2D曲線的屬性設(shè)置
網(wǎng)格線plt, 軸面與子軸面, 坐標(biāo)軸的樣式與界限, 坐標(biāo)軸的標(biāo)簽plt.ysticks([-1, 0, 1])、 圖例legend()
線性linestyle樣式marker顏色color背景色 透明度 - 2D圖形
直方圖plt.hist、 條形圖plt.bar、 餅圖plt.pie、 散點(diǎn)圖plt.scatter、 玫瑰圖(極坐標(biāo)) - 3D圖形
- 2D曲線
Machine learning
- 經(jīng)驗(yàn)
經(jīng)驗(yàn)即是數(shù)據(jù), 客觀世界中一切事物都可以用數(shù)據(jù)來(lái)表示, 一般情況我們表示客觀食物的時(shí)候, 習(xí)慣用他們的一些特征量化描述, 一般這些特征可以組合成一個(gè)向量, 即特征向量
數(shù)據(jù)是機(jī)器學(xué)習(xí)的基礎(chǔ) - 任務(wù)
根據(jù)數(shù)據(jù)模型和算法模型的不同可以將機(jī)器學(xué)習(xí)氛圍監(jiān)督學(xué)習(xí)和無(wú)監(jiān)督學(xué)習(xí)- 監(jiān)督學(xué)習(xí)
主要任務(wù)(理念): 利用現(xiàn)有數(shù)據(jù)推測(cè)未知數(shù)據(jù)
數(shù)據(jù)特點(diǎn): 數(shù)據(jù)有兩部分, 即特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù)- 分類: 標(biāo)簽數(shù)據(jù)是離散的, 相互無(wú)關(guān)聯(lián)的, 明確的(水果種類)
- 回歸: 標(biāo)簽數(shù)據(jù)是連續(xù)的, 相互關(guān)聯(lián)的, 不明確的(房?jī)r(jià))
算法: K-近鄰、線性回歸器、 邏輯斯蒂回歸、 樸素貝葉斯、 決策樹(shù)、 隨機(jī)森林、 SVM ... ...
- 無(wú)監(jiān)督學(xué)習(xí)
對(duì)客觀事物本身的特征進(jìn)行分析與認(rèn)知
數(shù)據(jù)特點(diǎn): 只有特征數(shù)據(jù)- 聚類: K-Means(根據(jù)指標(biāo),簇之間的離散程度和聚合程度達(dá)到最優(yōu))
- 特征降維: PCA 主成分分析法
- 監(jiān)督學(xué)習(xí)
- 性能
- 完成既定任務(wù)的質(zhì)量的評(píng)測(cè)指標(biāo):
分類問(wèn)題: 準(zhǔn)確率, 精準(zhǔn)率, 召回率, F1指標(biāo)
回歸問(wèn)題: 均方誤差, 平均絕對(duì)誤差 - 性能調(diào)優(yōu)
從數(shù)據(jù)上: 數(shù)據(jù)的正則化, 數(shù)據(jù)的標(biāo)準(zhǔn)化 ... ...
從算法上: 不同的算法通過(guò)調(diào)參進(jìn)行性能調(diào)優(yōu)
- 完成既定任務(wù)的質(zhì)量的評(píng)測(cè)指標(biāo):
深度學(xué)習(xí)
神經(jīng)網(wǎng)絡(luò): 基礎(chǔ)神經(jīng)網(wǎng)絡(luò), 俊基神經(jīng)網(wǎng)絡(luò), 循環(huán)神經(jīng)網(wǎng)絡(luò), 框架TensorFlow
監(jiān)督學(xué)習(xí)算法
K nearest nerghbour
from sklearn.neighbours import KNerghborsClassifier, KNeighborsRegressor
- 歐氏距離 Euclidean Distance (歐幾里得距離)
- K-近鄰算法的原理
- 求某個(gè)樣本點(diǎn)到所有已知樣本點(diǎn)之間的距離, 得到 d1, d2, ... ... dn
- 對(duì)以上的距離進(jìn)行從小到大的排序
- 對(duì)以上排序完的那些距離取前K個(gè)( <=20 )
- 對(duì)這前K個(gè)距離對(duì)應(yīng)的標(biāo)簽進(jìn)行分析, 如果某個(gè)標(biāo)簽占優(yōu)勢(shì), 那么未知點(diǎn)就歸屬于這個(gè)標(biāo)簽
- 優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 精度高, 算法簡(jiǎn)單, 無(wú)需輸入假定數(shù)據(jù)
缺點(diǎn): 時(shí)間復(fù)雜度 和 空間復(fù)雜度 高 - 回歸模型的原理是計(jì)算K近鄰歐氏距離的平均值進(jìn)行擬合回歸
LinearRegression *
from sklearn.linear_model import LinearRegression
lr = LinearRegression(fit_intercopt=True, noemalize=False, copy_X=True, n_jobs=None)
# fit_intercopt 是否計(jì)算截距
# noemalize在計(jì)算拮據(jù)的情況下, 回歸前歸一化, 回歸因子X(jué)為減去均值,除以L2范數(shù)
# copy_X復(fù)制或覆蓋
# n_jobs 采用多少CPU計(jì)算 n_jobs=-1 有多少用多少</pre>
- 線性方程
y = w1x1 + w2x2 + ... ... + wnxn + b
令 W = (w1, w2 ... ... wn), X = (x1, x2, ... ... xn)
則 y = W * X ^ T + b
稱 W 為回歸系數(shù), X 為特征向量, b 為截距 - 線性方程的推導(dǎo)
現(xiàn)有 m 個(gè)已知樣本, 每個(gè)樣本有 n 個(gè)特征記為 X1, X2, ... ... , Xm 每個(gè)X中都有 n 個(gè) x
對(duì)應(yīng)的標(biāo)簽記為: y1, y2, ... ... , ym ,且特征和標(biāo)簽成線性關(guān)系
此時(shí)只要求得 W 就可得到線性回歸方程
? 將m個(gè)已知量帶入方程會(huì)得到方程組:
? y1 = W * X1 ^ T + b = w1x1_1 + w2x1_2 + ... ... + wnx1_n + b
? y2 = W * X2 ^ T + b = w1x2_1 + w2x2_2 + ... ... + wnx2_n + b
? ... ...
? ym = W * Xm ^ T + b = w1xm_1 + w2xm_2 + ... ... + wnxm_n + b
? 討論: m > n 且無(wú)共線, 方程無(wú)解
? m = n 且無(wú)共線, 有且只有一個(gè)解
? m < n 無(wú)數(shù)個(gè)解
? 在實(shí)際生產(chǎn)環(huán)境中 m >> n (樣本數(shù)遠(yuǎn)遠(yuǎn)大于特征維度), 所以上述方案行不通 - 最小二乘法
- 假設(shè) W’ 和 b‘ 是最合適的, 得到假設(shè)出來(lái)的回歸方程: W‘ * X ^ T + b’
- 把所有的樣本帶入, 得到假設(shè)的那些標(biāo)簽數(shù)據(jù):
y1' = W' * X1 ^ T + b'
y2' = W' * X2 ^ T + b'
... ...
ym' = W' * Xm ^ T + b'
此時(shí) y1', y2', ... .. , ym' 都是通過(guò)假設(shè)的 W' 和 b‘ 得到的標(biāo)簽, 那么真實(shí)的標(biāo)簽 y1, y2, ... .. , ym 和假設(shè)推導(dǎo)的標(biāo)簽之間一定存在差異 - 求真實(shí)的標(biāo)簽和假設(shè)推導(dǎo)的標(biāo)簽之間存在的差異 (因?yàn)椴町愑姓?fù) 所以采用平方)
H = (y1' - y1) ^ 2 + (y2' -y2) ^ 2 + ... ... + (ym' -ym) ^ 2
將推導(dǎo)量帶入得到
H = (W'X1 ^ T - y1) ^ 2 + (W'X2 ^ T - y2) ^ 2 + ... ... + (W'Xm ^ T - ym) ^ 2 - 求差異的最小值
對(duì) H 求導(dǎo) 為 0 得到極小值點(diǎn)
H’ = 2[W' * X1 ^ T - X1 ^ T * y1] + ... + 2[W' * Xm ^ T - Xm ^ T * ym]
令 X = (X1, X2, ... ... , Xm) Y = (y1, y2, ... ... , ym)
H' = 2W'X^T - 2X^TY
令 H‘ = 0 得到極小值
W'X^T * X = X^TY * X
X^T * X 是否可逆?- 如果可逆 W’ = (X ^ T * X)^(-1) * X ^ T * y * X
行列式不等于0 滿秩矩陣 - 不可逆 引入嶺回歸 W'*(X^T * X + λI) = X^TY * X 【I是單位矩陣(對(duì)角線為1), λ為縮減系數(shù)】
此時(shí) W‘ 的值除了受已知數(shù)據(jù)的影響以外還受 λ 的影響
W' = (X^T * X + λI)^(-1) * X^TY * X
from sklearn.linear_model import Ridge改良的最小二乘法
1.嶺回歸可以解決特征數(shù)量比樣本量多的問(wèn)題
2.嶺回歸作為一種縮減算法可以判斷哪些特征重要或者不重要,有點(diǎn)類似于降維的效果
3.縮減算法可以看作是對(duì)一個(gè)模型增加偏差的同時(shí)減少方差
嶺回歸用于處理下面兩類問(wèn)題:
1.數(shù)據(jù)點(diǎn)少于變量個(gè)數(shù)
2.變量間存在共線性(最小二乘回歸得到的系數(shù)不穩(wěn)定,方差很大) -
from sklearn.learn_model import Lasso
羅斯回歸與嶺回歸的區(qū)別是羅斯回歸采用L1正則:懲罰系數(shù)的絕對(duì)值
- 如果可逆 W’ = (X ^ T * X)^(-1) * X ^ T * y * X
邏輯斯蒂
from sklearn.learn_model import LogisiticRegression
計(jì)算量非常小,速度很快,存儲(chǔ)資源低,缺點(diǎn)就是因?yàn)槟P秃?jiǎn)單,對(duì)于復(fù)雜的情況下會(huì)出現(xiàn)欠擬合,并且只能處理2分類問(wèn)題, 信用評(píng)測(cè), 營(yíng)銷活動(dòng)成功率概率, 產(chǎn)品銷售預(yù)測(cè),
? 特征向量: X = (x1, x2, ... ... , xn)
? 回歸系數(shù): W = (w1, w2, ... ... , wn)
? 截距: b
? 標(biāo)簽: Y
? 如果 Y 和 X 成線性關(guān)系, 且 Y 是連續(xù)的, 則可以表示成: Y = W * X ^ T + b
-
二分類問(wèn)題: 在實(shí)數(shù) R 的范圍內(nèi)把 Y 進(jìn)行二分類, 即把 Y 映射到集合{0, 1}中, 把 Y 映射到(0, 1) 區(qū)間中, 然后進(jìn)行二分類。(例如糖尿病案例中的標(biāo)簽是醫(yī)學(xué)指標(biāo)需要使用單位階躍函數(shù)轉(zhuǎn)為二分類問(wèn)題)
現(xiàn)在需要找到一個(gè)函數(shù)具有性質(zhì): 單調(diào)遞增, 作用于(-∞, +∞), 值域(0, 1)
邏輯斯蒂函數(shù) g(z) = 1/(1 + e^(-z))
g(z)' = [1/(1 + e(-z))2] * (e^(-z)) > 0 單調(diào)遞增
作用域: R, 值域: z趨向于 -∞ g(z) 趨向于 0 ; z趨向于 +∞ g(z) 趨向于 1
選擇分類點(diǎn): z< 0 g(z)<0.5 認(rèn)為是0
? z>0 g(Z)>0.5 認(rèn)為是1
g(y) = 1/(1 + e^(-y)) -------- g(x) = 1/(1 + e ^ ( - W * x ^ T - b))
此時(shí) g(x) 是 推導(dǎo)的標(biāo)簽 是離散的 因此不能用最小二乘法
-
最大似然估計(jì)
X1 對(duì)應(yīng) Y1 這件事發(fā)生的概率, 記為 P(X=X1, Y=Y1)
... ...
Xm 對(duì)應(yīng) Ym 這件事發(fā)生的概率, 記為 P(X=Xm, Y=Ym)
目標(biāo): 求上述事件(相互獨(dú)立)同時(shí)發(fā)生的是最大概率 : P = P(X=X1, Y=Y1)P(X=X2, Y=Y2)...(X=Xm, Y=Ym)
-
構(gòu)造似然函數(shù)(損失函數(shù))
P(x, y) = (g(x) ^ y) * (1 - g(x)) ^ (1 - y))
帶入樣本
P(X1, Y1) = (g(X1) ^ Y1) * (1 - g(X1)) ^ (1 - Y1))
... ...
P(Xm, Ym) = (g(Xm) ^ Ym) * (1 - g(Xm)) ^ (1 - Ym))
總概率:
L(W, b) = P(X1, Y1)...P(Xm, Ym) = [(g(X1) ^ Y1) * (1-g(X1)) ^ (1-Y1))]...[(g(Xm) ^ Ym) * (1-g(Xm)) ^ (1-Ym))]
-
求似然函數(shù)的最大值
連乘求導(dǎo)過(guò)于麻煩, 引入 ln 將連乘變成連加
lnL(W, b) = ln[[(g(X1) ^ Y1) * (1-g(X1)) ^ (1-Y1))]...[(g(Xm) ^ Ym) * (1-g(Xm)) ^ (1-Ym))]]
? = ln[[(g(X1) ^ Y1) * (1-g(X1)) ^ (1-Y1))]] + ... + ln[[(g(Xm) ^ Ym) * (1-g(Xm)) ^ (1-Ym))]]
求導(dǎo) L(W, b)' = 0的到最合適的 W (僅限于W有一個(gè)值, 如果有多個(gè)值則引入梯度下降或擬牛頓法求解)
-
-
梯度下降 (常用于優(yōu)化算法,線性收斂的隨機(jī)優(yōu)化算法)
from sklearn.learn_model import SGDClassifier梯度的方向是最大方向?qū)?shù)的方向
-
二維空間中
y = x ^ 2
微分 dy = dx ^ 2 = 2x dx
在點(diǎn)(1, 1) 處dy = 2 即為切線的斜率 , 下降最快的方向
-
三維空間中
z = x ^ 2 + y ^ 2
過(guò)三維曲面中的某個(gè)點(diǎn)可以做無(wú)數(shù)條切線, 其中梯度方向的切線是下降最快的
-
求偏導(dǎo)數(shù)
δz/δx 對(duì) x 的偏導(dǎo)數(shù) 2x ; δz/δy 對(duì) y 的偏導(dǎo)數(shù) 2x
-
梯度方向向量
(δz/δx, δz/δy) = (2x, 2y)
梯度下降的過(guò)程:
-
二維空間 J(x) = x ^ 2
求梯度: 二維空間的梯度就是微分 J(x)' = 2x
初始化一個(gè)起始點(diǎn) x0
設(shè)置學(xué)習(xí)步長(zhǎng)(學(xué)習(xí)率) α = 0.4
-
根據(jù)梯度下降公式, 不斷的迭代, 直至下降到合適的位置
案例 J(x) = x ^ 2, x0 = 1, J(x)' = 2x, α = 0.4
? x1 = x0 - 0.4 * 2 * 1 = 0.2
? x2 = x1 - 0.4 * 2 * 0.2 = 0.04
? ... ...
-
三維空間 Z = X ^ 2 + Y ^ 2
求梯度 (2x, 2y)
設(shè)置起始點(diǎn) p0(3, 4)
設(shè)置學(xué)習(xí)率 α = 0.1
-
迭代下降
p1 = p0 - 0.1 * (2 * 3, 2 * 4) = (2.4, 3.2)
... ...
-
樸素貝葉斯
from sklearn.naive_bayes import GaussianNB, MultionmialNB, BernoulliNB
高斯, 多項(xiàng)式文本分類, 伯努利文本分類多適用于小型文本,
-
條件概率
P(A|B) = P(AB) / P(B) <===> P(AB) = P(A|B)P(B)
在 B 已經(jīng)發(fā)生的基礎(chǔ)上 A 發(fā)生的概率, A 和 B 是相互獨(dú)立事件
-
全概率
全概率公式表達(dá)的是由因溯果
-
貝葉斯公式
由果溯因, 事件已經(jīng)發(fā)生, 推測(cè)是哪個(gè)因素造成的
-
樸素貝葉斯分類器基于貝葉斯理論及其假設(shè)(即特征之間是獨(dú)立的,互不相互影響的)
P(A|B) = P(B|A)P(A) / P(B)
P(A|B) 是后驗(yàn)概率, P(B|A)是似然 P(A)是先驗(yàn)概率 ,P(B)是預(yù)測(cè)的值
具體應(yīng)用: 垃圾郵件檢測(cè), 文章分類, 情感分類, 人臉識(shí)別
SVM *
from sklearn.svm import SVC, SVR
在N維空間找到一個(gè)(N-1)維的超平面將樣本空間分為兩類。
具體應(yīng)用: 廣告展示, 性別檢測(cè), 大規(guī)模圖像識(shí)別
通過(guò)核函數(shù),支持向量機(jī)可以將特征向量映射到更高維的空間中,是的原本線性不可分的數(shù)據(jù)在映射之后的空間中變得線性可分。
在是顯示不需要直接對(duì)特征向量做映射,耳式用核函數(shù)對(duì)兩個(gè)特征響亮的內(nèi)積進(jìn)行變換,這樣做等價(jià)于先對(duì)箱量進(jìn)行映射然后做內(nèi)積。
[圖片上傳失敗...(image-3f220a-1551434906070)]
決策樹(shù) *
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
線性結(jié)構(gòu)(列表 棧 隊(duì)列)、 散列結(jié)構(gòu) 、 樹(shù)形結(jié)構(gòu) (至多有一個(gè)前驅(qū), 可以有多個(gè)后繼) 、 網(wǎng)絡(luò)結(jié)構(gòu)(有方向的圖)
- 參數(shù)說(shuō)明
class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2,min_samples_leaf =1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None,class_weight=None, presort=False)
'''
criterion:string類型,可選(默認(rèn)為"gini")
衡量分類的質(zhì)量。支持的標(biāo)準(zhǔn)有"gini"代表的是Gini impurity(不純度)與"entropy"代表的是information gain(信息增益)。
?
splitter:string類型,可選(默認(rèn)為"best")
一種用來(lái)在節(jié)點(diǎn)中選擇分類的策略。支持的策略有"best",選擇最好的分類,"random"選擇最好的隨機(jī)分類。
?
max_features:int,float,string or None 可選(默認(rèn)為None)
在進(jìn)行分類時(shí)需要考慮的特征數(shù)。
1.如果是int,在每次分類是都要考慮max_features個(gè)特征。
2.如果是float,那么max_features是一個(gè)百分率并且分類時(shí)需要考慮的特征數(shù)是int(max_features*n_features,其中n_features是訓(xùn)練完成時(shí)發(fā)特征數(shù))。
3.如果是auto,max_features=sqrt(n_features)
4.如果是sqrt,max_features=sqrt(n_features)
5.如果是log2,max_features=log2(n_features)
6.如果是None,max_features=n_features
注意:至少找到一個(gè)樣本點(diǎn)有效的被分類時(shí),搜索分類才會(huì)停止。
?
max_depth:int or None,可選(默認(rèn)為"None")
表示樹(shù)的最大深度。如果是"None",則節(jié)點(diǎn)會(huì)一直擴(kuò)展直到所有的葉子都是純的或者所有的葉子節(jié)點(diǎn)都包含少于min_samples_split個(gè)樣本點(diǎn)。忽視max_leaf_nodes是不是為None。
?
min_samples_split:int,float,可選(默認(rèn)為2)
區(qū)分一個(gè)內(nèi)部節(jié)點(diǎn)需要的最少的樣本數(shù)。
1.如果是int,將其最為最小的樣本數(shù)。
2.如果是float,min_samples_split是一個(gè)百分率并且ceil(min_samples_split*n_samples)是每個(gè)分類需要的樣本數(shù)。ceil是取大于或等于指定表達(dá)式的最小整數(shù)。
?
min_samples_leaf:int,float,可選(默認(rèn)為1)
一個(gè)葉節(jié)點(diǎn)所需要的最小樣本數(shù):
1.如果是int,則其為最小樣本數(shù)
2.如果是float,則它是一個(gè)百分率并且ceil(min_samples_leaf*n_samples)是每個(gè)節(jié)點(diǎn)所需的樣本數(shù)。
?
min_weight_fraction_leaf:float,可選(默認(rèn)為0)
一個(gè)葉節(jié)點(diǎn)的輸入樣本所需要的最小的加權(quán)分?jǐn)?shù)。
?
max_leaf_nodes:int,None 可選(默認(rèn)為None)
在最優(yōu)方法中使用max_leaf_nodes構(gòu)建一個(gè)樹(shù)。最好的節(jié)點(diǎn)是在雜質(zhì)相對(duì)減少。如果是None則對(duì)葉節(jié)點(diǎn)的數(shù)目沒(méi)有限制。如果不是None則不考慮max_depth.
?
class_weight:dict,list of dicts,"Banlanced" or None,可選(默認(rèn)為None)
表示在表{class_label:weight}中的類的關(guān)聯(lián)權(quán)值。如果沒(méi)有指定,所有類的權(quán)值都為1。對(duì)于多輸出問(wèn)題,一列字典的順序可以與一列y的次序相同。
"balanced"模型使用y的值去自動(dòng)適應(yīng)權(quán)值,并且是以輸入數(shù)據(jù)中類的頻率的反比例。如:n_samples/(n_classes*np.bincount(y))。
對(duì)于多輸出,每列y的權(quán)值都會(huì)想乘。
如果sample_weight已經(jīng)指定了,這些權(quán)值將于samples以合適的方法相乘。
?
random_state:int,RandomState instance or None
如果是int,random_state 是隨機(jī)數(shù)字發(fā)生器的種子;如果是RandomState,random_state是隨機(jī)數(shù)字發(fā)生器,如果是None,隨機(jī)數(shù)字發(fā)生器是np.random使用的RandomState instance.
?
persort:bool,可選(默認(rèn)為False)
是否預(yù)分類數(shù)據(jù)以加速訓(xùn)練時(shí)最好分類的查找。在有大數(shù)據(jù)集的決策樹(shù)中,如果設(shè)為true可能會(huì)減慢訓(xùn)練的過(guò)程。當(dāng)使用一個(gè)小數(shù)據(jù)集或者一個(gè)深度受限的決策樹(shù)中,可以減速訓(xùn)練的過(guò)程。
'''
decision_tree.feature_importances_ # 查看屬性的重要性
?
繪制一棵決策樹(shù) pip install graphviz (并配置環(huán)境變量)
import graphviz
dot = sklearn.tree.export_graphviz(decison_tree, out_file=None, max_depth=None, filled=None)
graphviz.Source(dot) # filled 填充顏色</pre>
決策樹(shù)算法
-
決策樹(shù)的定義:
用非葉子表示模型的特征用葉子節(jié)點(diǎn)來(lái)表示標(biāo)簽
每一個(gè)分支都是當(dāng)前特征在特定值域上的輸出
-
如何構(gòu)造以可決策樹(shù)
關(guān)鍵: 屬性的分裂, 如何在某個(gè)節(jié)點(diǎn)處根據(jù)屬性的不同構(gòu)造不同的輸出
理論基礎(chǔ): 信息論
三種情況
- 屬性是離散的并且不要求構(gòu)建二叉樹(shù)(有多少中取值就夠賤多少個(gè)分支)
- 屬性是離散的需要構(gòu)建二叉樹(shù)(將離散的標(biāo)簽按照需求歸類)
- 屬性是連續(xù)的(取若干個(gè)區(qū)間 將對(duì)應(yīng)的值劃分到區(qū)間中進(jìn)行分類)
ID3 算法
- 信息量 :
如果參與分類的事物可以劃分到多個(gè)分類中去, 記 X 為該信息, 則該信息的信息量為:(比如X可以劃分為n個(gè)類別, 則第i個(gè)類別的信息量為 L(xi) = -log2(P(xi)), P(xi)表示xi出現(xiàn)的概率)
數(shù)學(xué)期望(mean)(或均值,亦簡(jiǎn)稱期望)是試驗(yàn)中每次可能結(jié)果的概率乘以其結(jié)果的總和,是最基本的數(shù)學(xué)特征之一。它反映隨機(jī)變量平均取值的大小 - 信息熵(香濃熵):
H = L(X1)P(X1) + ... ... + L(Xn)P(Xn)
例如: 11個(gè)人中5個(gè)貸款6個(gè)不貸款 H = -5/11 * log2(5/11) -6/11 * log2(6/11) = 0.994 - 計(jì)算每一個(gè)特征 相對(duì) 類別的劃分 的熵:
例如: 11個(gè)人中 3個(gè)自由職業(yè)者中有一個(gè)貸款, 4個(gè)工人1個(gè)貸款 4個(gè)白領(lǐng)3個(gè)貸款
則: info = 3/11 * (-1/3 * log2(1/3) - 2/3 * log2(2/3))+ 4/11 * 1/4(-1/4 * log2(1/4) - 3/4 * log2(3/4)) + 4/11 * (-3/4 * log2(3/4) - 1/4 * log2(1/4)) = 0.840 - 計(jì)算每一個(gè)特征的信息增益:
信息熵 - 每個(gè)特征相對(duì)類別劃分的熵 = 0.994 - 0.840 = 0.154
對(duì)計(jì)算的結(jié)果進(jìn)行比較。
C4.5決策樹(shù):
為了解決ID3決策樹(shù)的缺點(diǎn):當(dāng)一個(gè)屬性值可取數(shù)目較多時(shí), 那么可能這個(gè)屬性對(duì)應(yīng)的可取值下的樣本只有一個(gè)或者很少個(gè), 此時(shí)信息增益非常高, ID3算法會(huì)認(rèn)為這個(gè)屬性非常適合用來(lái)劃分, 但較多屬性來(lái)進(jìn)行劃分帶來(lái)的問(wèn)題是他的泛化能力很弱, 不能對(duì)新樣本進(jìn)行有效的預(yù)測(cè)。
所以C4.5 采用信息增益率來(lái)作為劃分依據(jù):
但是增增益率會(huì)偏好取值數(shù)目較少的屬性, 因此C4.5決策樹(shù)會(huì)先從候選劃分屬性中找出信息增益高于平均水平的屬性,再?gòu)闹羞x擇增益率最高的
CART 算法:
-
也叫分類回歸樹(shù), 既能分類有能回歸
CART是一顆二叉樹(shù)
如果是CART分類樹(shù), 采用GINI值來(lái)作為節(jié)點(diǎn)分裂的依據(jù);如果是CART回歸樹(shù), 采用樣本的最小方差作為節(jié)點(diǎn)的分裂依據(jù)
如何選擇分裂屬性
-
GINI 值的計(jì)算
? GINI = 1 - [P1 ^ 2 + P2 ^ 2 + ... ... + Pn ^ 2] 節(jié)點(diǎn)的純度越低, GINI 值越大 (越小屬性越重要) -
回歸方程的方差: δ = [(x1 - u) ^ 2 + (x2 - u) ^ 2 + ... ... + (xn - u) ^ 2] ^ 0.5
方差越大, 數(shù)據(jù)越離散, 預(yù)測(cè)的性能就越低
-
如何分裂成一顆二叉樹(shù)
?
集成算法
ada,gbdt, xgboost 常用 max_depth = 6, 而 decision_tree , randomForest 常用 max_depth = 15
boosting 提升
學(xué)習(xí)器之間存在先后順序,初始時(shí)。每個(gè)樣本的權(quán)重相等,首先第一個(gè)學(xué)習(xí)器訓(xùn)練樣本進(jìn)行學(xué)習(xí),學(xué)習(xí)完成后,增大錯(cuò)誤樣本的權(quán)重,同時(shí)減小正確樣本的權(quán)重,再利用第二個(gè)學(xué)習(xí)期對(duì)其進(jìn)行學(xué)習(xí),依次進(jìn)行下去,最終得到b個(gè)學(xué)習(xí)器。最終合并b個(gè)學(xué)習(xí)其的結(jié)果,同時(shí)與bagging的不同的是,每個(gè)學(xué)習(xí)器的權(quán)重也不一樣。
Adaboost
from sklearn.ensemble import AdaBoostClassidier
重復(fù)選擇表現(xiàn)一般的模型,每次基于先前模型的表現(xiàn)進(jìn)行調(diào)整, 不同的是 ada是通過(guò)提升數(shù)據(jù)點(diǎn)的權(quán)重來(lái)定位模型的不足,而gbdt是通過(guò)算梯度定位模型的不足,因此 gbdt可使用更多種類的不妙函數(shù),而這主要區(qū)別在于 識(shí)別模型的問(wèn)題,ada用錯(cuò)分?jǐn)?shù)據(jù)來(lái)識(shí)別問(wèn)題,通過(guò)調(diào)整錯(cuò)分?jǐn)?shù)據(jù)的權(quán)重來(lái)進(jìn)行模型的改進(jìn)。 gbdt梯度提升樹(shù)通過(guò)計(jì)算梯度來(lái)改進(jìn)。
GBDT
CART 作為基分類器。
每棵樹(shù)學(xué)的是之前樹(shù)的殘差(預(yù)測(cè)值為前面所有樹(shù)累加的和)
后面的學(xué)習(xí)器糾正前面的所有若學(xué)習(xí)器的殘差,最終將多個(gè)學(xué)習(xí)器像加在一起用來(lái)進(jìn)行最終的預(yù)測(cè)(每一次計(jì)算都是為了減少上一次的殘差,即利用殘差學(xué)模型, 為了消除殘差,會(huì)在殘差減少的梯度方向上減少一個(gè)新的模型)
梯度提升樹(shù) 進(jìn)行特征重要性排序
from sklearn.ensemble import GradientBosstingClassifier
gbdt = GradientBosstingClassifier(n_estimators,learning_rate=0.2, )
gbdt.fit(data, target)
fi = gbdt.feature_importances_.argsort()[::-1] # 特征重要性的索引排序
?</pre>
XGBOOST
pip install xgboost GBDT 的極端化,2014年 陳天奇
from xgboost.sklearn import XGBClassifier
支持線性分類器,相當(dāng)于帶L1 和L2 正則化項(xiàng)的LR或線性回歸。
xgboost,plot_importance(xgb) 顯示屬性重要性排序
xgboost.plot_tree(xgb, num_tree=0,ax=axes) 繪制索引為0的樹(shù)
構(gòu)造損失函數(shù): 真實(shí)值與預(yù)測(cè)值的 均方誤差/ 似然函數(shù)
求損失函數(shù)的最小值
用集成學(xué)習(xí)算法表示預(yù)測(cè)值 yi' = f1(xi) + f2(xi) + ... ... + fk(xi), f代表每一棵樹(shù)映射函數(shù)
找到最合適的 K
-
原理 http://m.itdecent.cn/p/7467e616f227
data = xgb.DMatrix ('data.txt')加載數(shù)據(jù)存在DMatrix對(duì)象中,每一行代表一個(gè)樣本 有 屬性索引 和 屬性值
-
優(yōu)勢(shì)
正則化
并行處理
高度靈活:用戶自定義優(yōu)化目標(biāo)和評(píng)價(jià)標(biāo)準(zhǔn)
缺失值處理:內(nèi)置處理缺失值的規(guī)則,XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法。并且會(huì)學(xué)習(xí)未來(lái)遇到缺失值時(shí)的處理方法。
剪枝:黨分裂遇到付損失時(shí)GBDT會(huì)提u能告知分裂,因此GBDT時(shí)貪心算法, XGBoost會(huì)一直分裂到指定的最大深度,然后回過(guò)頭剪枝。
內(nèi)置交叉驗(yàn)證:在每一輪迭代中使用交叉驗(yàn)證,可以方便獲得最優(yōu)迭代次數(shù),而GBDT是用網(wǎng)格搜索智能檢測(cè)有限個(gè)值。
在已有的模型基礎(chǔ)上繼續(xù)學(xué)習(xí)
-
參數(shù)調(diào)優(yōu)https://www.cnblogs.com/mfryf/p/6293814.html
booster 選擇每次迭代的模型
gbtree基于樹(shù)的模型(默認(rèn))
gbliner線性模型silent 但這個(gè)參數(shù)值為1時(shí) 靜默模式開(kāi)啟 不會(huì)輸出任何信息,一般保持默認(rèn)0,幫助我們更好的理解模型
nthread 用來(lái)進(jìn)行多線程控制,默認(rèn)為最大可能的線程數(shù)(使用CPU全部的核)
eta 和GBDT種的 learning rate 類似,通過(guò)減少每一步的權(quán)重可以提高模型的魯棒性 典型值:0.01~0.02
min_chile_weight 默認(rèn)為1 決定最小葉子節(jié)點(diǎn)樣本權(quán)重和,類似 GBDT的min_child_leaf(最小樣本總數(shù)), 這個(gè)參數(shù)用于避免過(guò)擬合,值越大,可以避免模型學(xué)習(xí)到局部的特殊樣本,但如果這個(gè)值越高會(huì)導(dǎo)致欠擬合,可以使用CV調(diào)優(yōu)
max_depth 默認(rèn)6 樹(shù)的最大深度 可以使用CV調(diào)優(yōu) 典型值:3~10
max_leaf_nodes 樹(shù)上最大的節(jié)點(diǎn)或葉子數(shù)量,可以替代max_depth的作用,因?yàn)槿绻啥鏄?shù),一個(gè)深度為n的樹(shù)最多n2個(gè)葉子,如果定義這個(gè)參數(shù)模型會(huì)忽略max_depth
gamma 默認(rèn)0,在節(jié)點(diǎn)分裂時(shí),只有分裂后損失函數(shù)的值下降了 才會(huì)分裂這個(gè)節(jié)點(diǎn),gamma制定了節(jié)點(diǎn)分裂所需的最小損失函數(shù)下降值。這個(gè)參數(shù)越大算法越保守,可使用CV調(diào)整,和損失函數(shù)息息相關(guān)。
max_delta_step 默認(rèn)0,限制每棵樹(shù)權(quán)重改變的最大步長(zhǎng),如果為0意味著沒(méi)有約束,如果被賦予正值會(huì)讓算法更加保守, 通常不設(shè)置。(各類樣本十分不平衡時(shí)可以嘗試)
subsample 默認(rèn)1,控制每棵樹(shù)隨機(jī)采樣的比例,減小這個(gè)參數(shù)的值,算法會(huì)更加保守,避免過(guò)擬合,(如果設(shè)置過(guò)小,會(huì)欠擬合)典型值0.5~1
colsample_bytree 默認(rèn)1,控制每棵隨機(jī)采樣的列數(shù)的占比 典型0.5~1
colsample_byleve 默認(rèn)1,控制樹(shù)的每一集的每一次分裂,對(duì)列數(shù)的采樣的占比,一般不調(diào)整
lambda 默認(rèn)1,權(quán)重的L2正則化項(xiàng),(和Ridge類似),可以應(yīng)用在很高維度的情況下使得算法的速度更快
-
scale_pos_weight 默認(rèn)1,在個(gè)類別十分不平衡是,把這個(gè)參數(shù)設(shè)置為正數(shù),可以使得算法更快收斂。
... ...
bagging 套袋
關(guān)注降低方差:度量了同等大小的訓(xùn)練集的變動(dòng)導(dǎo)致學(xué)習(xí)性能的變化??坍?huà)了數(shù)據(jù)擾動(dòng)所導(dǎo)致的影響。
通過(guò)對(duì)訓(xùn)練樣本重新采樣的方法得到不同的訓(xùn)練樣本集,在這些新的訓(xùn)練樣本集上分別訓(xùn)練學(xué)習(xí)器,最終合并每一個(gè)學(xué)習(xí)器的結(jié)果,作為最終的學(xué)習(xí)結(jié)果。
隨機(jī)森林
from sklearn.ensemble import RandomForestClassifier
確定森林中的樹(shù)是 CART 二叉樹(shù)
樣本隨機(jī): 從樣本中隨機(jī)有放回的抽取 n 個(gè)樣本(樣本有重復(fù))
特征隨機(jī): 從所有的屬性中隨機(jī)選取 k 個(gè)屬性, 選擇最佳的分割屬性作為節(jié)點(diǎn)建立決策樹(shù)
重復(fù)以上步驟 m 次, 即建立 m 棵CART決策樹(shù)
-
這 m 棵CART樹(shù)形成隨機(jī)森林, 通過(guò)投票表決結(jié)果, 決定數(shù)據(jù)屬于哪一類
投票機(jī)制: 一票否決、 少數(shù)服從多數(shù)、 加權(quán)
模型調(diào)參:
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_split=1e-07, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=True, random_state=10, verbose=0, warm_start=False)
---------------------
- 選取 K 值
- 設(shè)置最大深度(一般不超過(guò)8)
- 棵數(shù)
- 最小分裂樣本數(shù)
- 類別比例
無(wú)監(jiān)督學(xué)習(xí)
聚類
K-means * from sklearn.cluster import KMeans
-
算法步驟
在整個(gè)樣本群中定義 K 個(gè)種子點(diǎn)、
分別計(jì)算每個(gè)樣本點(diǎn)到所有種子點(diǎn)的歐式距離, 標(biāo)記最小的距離為該種子點(diǎn)代表的簇
當(dāng)所有樣本點(diǎn)類簇的歸屬全部劃分完成后, 把每一個(gè)種子點(diǎn)移動(dòng)到其所代表的那個(gè)類簇點(diǎn)群的幾何中心
重復(fù) 2 3 兩步, 直至所有的種子點(diǎn)不需要在移動(dòng)為止
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,n_clusters=8,
n_init=10, n_jobs=None, precompute_distances='auto',random_state=None,
tol=0.0001, verbose=0)
訓(xùn)練過(guò)程: 根據(jù) K-means++ 選取 8 個(gè)種子點(diǎn), 計(jì)算所有樣本點(diǎn)到每一個(gè)種子點(diǎn)的歐氏距離, 取這個(gè)樣本點(diǎn)距離最近的那個(gè)種子點(diǎn), 該樣本點(diǎn)就劃歸為這個(gè)種子點(diǎn)的簇。將種子點(diǎn)移動(dòng)到該簇的幾何中心, 再循環(huán)上面的操作, 直至種子點(diǎn)不再移動(dòng)為止。 最后得到八個(gè)有序號(hào)的簇(不是標(biāo)簽, 因?yàn)槎啻斡?xùn)練序號(hào)可能會(huì)發(fā)生改變)
預(yù)測(cè) km.predict(digits_x_train) 得到的是所屬的簇的序號(hào)
digits_y_pre = km.predict(digits_x_test) 預(yù)測(cè)的簇的序號(hào)
?
?</pre>
-
ARI 指標(biāo), 適用于有對(duì)應(yīng)的標(biāo)簽數(shù)據(jù)(聚類問(wèn)題一般沒(méi)有標(biāo)簽數(shù)據(jù)), 代表的是聚類的劃分和標(biāo)簽的劃分的吻合程度
from sklearn.metrics import adjusted_rand_scoreadjusted_rand_score(digits_y_test, digits_y_pre) -
輪廓系數(shù): 用于評(píng)測(cè)聚類劃分的性能, 兼顧了聚類內(nèi)部的凝聚程度和聚類之間的離散程度
from sklearn.metrics import silhouette_score樣本輪廓系數(shù)的平均數(shù)輸出聚類的編號(hào)
labels = km.labels_silhouette_score(digits_x_train, labels) 尋找最優(yōu)聚類個(gè)數(shù)
clusters = [2,3,4,5,6,7,8,9,10]
scores = []
for cluster in clusters:
km = KMeans(n_clusters=cluster)
km.fit(digits_data)
labels = km.labels_
score = silhouette_score(digits_data, labels)
scores.append(score)
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(clusters, scores)
plt.show()</pre>
聚類算法有多種: 中心聚類,關(guān)聯(lián)聚類,密度聚類,概率聚類,降維,圣經(jīng)網(wǎng)絡(luò)/深度學(xué)習(xí)
數(shù)據(jù)升維
多項(xiàng)式特征生成器
from sklearn.preprocessing import PolynomialFeatures
特征降維
PCA *
from sklearn.decomposition impoprt PCA
在數(shù)據(jù)挖掘的過(guò)程中, 某些屬性之間存在相關(guān)性, 可以抹去或者通過(guò)某些算法把他們映射到更低的維度, 從而提高機(jī)器學(xué)習(xí)的效率和準(zhǔn)確率。
-
向量的內(nèi)積和投影
-
內(nèi)積:兩個(gè)維度(特征個(gè)數(shù))相同的向量
(a1, a2, ... ... ,an)^T 和 (b1, b2, b3, ... ... , bn) ^T
(a1, a2, ... ... ,an) * (b1, b2, b3, ... ... , bn) ^T = a1b1 + a2b2 + ... ... + anbn
-
向量?jī)?nèi)積的幾何意義:
二維空間中有兩個(gè)向量 A(x1, y1), B(x2, y2)
|A|*cosα 為 A 向量 在 B 向量上的投影
A * B = |A| * |B| * cosα 為內(nèi)積
此時(shí)如果 B 為單位向量 那么 A * B = |A| * cosα 為 A 在 B 上的投影
-
向量基
在一個(gè)平面直角坐標(biāo)系中, 表示某個(gè)點(diǎn)P(x0, y0) 此時(shí)向量P值就是(x0, y0)
x軸y軸上個(gè)存在一個(gè)模為1的向量(1, 0) 和 (0, 1) 稱(1, 0) , (0, 1) 為二維空間中的一組基
只要是兩個(gè)線性無(wú)關(guān)的單位向量都可以作為整個(gè)空間的一組基
一般情況下, 我們有m個(gè)n維向量, 像將其轉(zhuǎn)換成R個(gè)由N維向量構(gòu)成的新空間, 首先將R個(gè)基 按照行進(jìn)行排寫(xiě)成一個(gè)矩陣A , 再將向量按照列組合成一個(gè)矩陣B, 然后計(jì)算 A * B
兩個(gè)矩陣相稱的物理意義: 實(shí)際上就是將右邊的矩陣的每一個(gè)列轉(zhuǎn)變到左邊矩陣為基的一個(gè)新的空間中
右邊矩陣的行數(shù)代表降維之前的維度, 左邊矩陣的行數(shù)代表降維以后的維度。
問(wèn)題: 如何選擇最優(yōu)基?
-
-
Principal Component Analysis 主成分分析
[[1, 1, 2, 4, 2], [1, 3, 3, 4, 4]]
-
讓每一個(gè)特征減去這個(gè)特征上所有值的平均值
[[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]
-
求去平均值以后的矩陣的協(xié)方差
方差: 每個(gè)樣本與均值的差的平方和除以樣本個(gè)數(shù)
協(xié)方差: Cov = (1/m)X*X^T = 1/5([6, 5], [4, 6])
-
求協(xié)方差矩陣的特征值及其對(duì)應(yīng)的特征向量
|C - λE| = 0 ====> |[6/5 - λ 4/5], [4/5 6/5 - λ]|
解得 λ = 2, 2/5即協(xié)方差矩陣C的特征值
對(duì)應(yīng)的特征向量依次是
特征向量標(biāo)準(zhǔn)化
把特征向量組成一個(gè)特征矩陣
驗(yàn)證矩陣的對(duì)角化
將特征值按照從大到小的順序排列, 取前K個(gè)特征值對(duì)應(yīng)的特征向量, 就構(gòu)成了K維的主成分空間即 P
降維, 對(duì) Y 向量降維, X = PY , X 就是 Y 的K維主成分空間
-
SVD矩陣分解
LDA
獨(dú)立成分分析(ICA)
與PCA相關(guān), 但他在發(fā)現(xiàn)潛在因素方面效果良好,它可以應(yīng)用在數(shù)字圖像、當(dāng)問(wèn)數(shù)據(jù)庫(kù)、經(jīng)濟(jì)指標(biāo)、心理測(cè)量等
SMOTE
針對(duì)類不均衡的過(guò)采樣算法
對(duì)于少數(shù)類的每一個(gè)樣本x, 以歐氏距離標(biāo)準(zhǔn)計(jì)算他到少數(shù)類樣本集中的所有樣本的距離, 得到其K近鄰
根據(jù)樣本不均衡比設(shè)置一個(gè)采樣比例以確定采樣倍率, 對(duì)于每一個(gè)少數(shù)類樣本x, 其K近鄰中隨機(jī)選擇若干個(gè)樣本, 假設(shè)選擇的近鄰為Xn
-
對(duì)每一個(gè)隨機(jī)選出的近鄰Xn, 分別與原樣本按如下公式構(gòu)建新的樣本
Xnew = X + rand(0, 1) * |x - xn|
from imblearn.over_sampling import SMOTE
smote = SMOTE()
target.value_counts() # 觀察是否存在樣本不均衡問(wèn)題
data, target = smote.fit_sample(data, target)
# 通過(guò)以上過(guò)采樣算法后 (target==0).sum() 與 (target==1).sum() 數(shù)量一樣多</pre>
缺陷:
K值選擇存在盲目性
無(wú)法克服非均衡數(shù)據(jù)集的數(shù)據(jù)分布問(wèn)題, 易產(chǎn)生分布邊緣化問(wèn)題, 因?yàn)樨?fù)類樣本決定了其緊鄰的可選擇位置, 會(huì)造成人造樣本越來(lái)越邊緣化, 是的邊界模糊加大算法分類難度。
預(yù)處理
特征工程: 篩選有用的特征
清洗: 缺失值, 異常值, 重復(fù)值
數(shù)據(jù)處理
- 數(shù)據(jù)的歸一化: 將屬性縮放到一個(gè)指定的最大值和最小值之間 通常是(0, 1)
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(data)
# (data-min(data)) / max(data) - min(data)</pre>
目的:
- 對(duì)于方差較小的屬性可以增加其穩(wěn)定性,
- 維持稀疏矩陣中0的條目,
- 防止過(guò)大的屬性對(duì)模型起過(guò)份主導(dǎo)作用
- 數(shù)據(jù)的標(biāo)準(zhǔn)化
將數(shù)據(jù)按照比例進(jìn)行縮放, 使之落入一個(gè)小的特定區(qū)間, 標(biāo)準(zhǔn)化以后的數(shù)據(jù)可正可負(fù)
from sklearn.preprocessing import StandardScaler
StandardScaler().fit_transform(data)
?
# (data - data.mean())/ data.std() 服從標(biāo)準(zhǔn)正態(tài)分布</pre>
- 數(shù)據(jù)的正則化
from sklearn.preprocessing import Normalizer
Normalizer().fit_transform(data)
# 默認(rèn)為L(zhǎng)2正則化</pre>
模型評(píng)測(cè)指標(biāo)
每個(gè)模型都自帶有一個(gè)性能檢測(cè)方法, score 在性能檢測(cè)過(guò)程中會(huì)把 data 帶入模型中進(jìn)行訓(xùn)練并得到預(yù)測(cè)值, 然后求預(yù)測(cè)值和 target 的吻合程度(準(zhǔn)確度, 從宏觀上表達(dá)了預(yù)測(cè)數(shù)據(jù)和真實(shí)數(shù)據(jù)的差別)
性能檢測(cè)報(bào)告
栗子:有兩個(gè)類別 A 和 B 預(yù)測(cè)結(jié)果有4種 TrueA,TrueB,F(xiàn)alseA,F(xiàn)alseB
精確率: 表示每一個(gè)類別預(yù)測(cè)正確的數(shù)量占預(yù)測(cè)為該類別的數(shù)量的比例
Preision_A = TrueA/(TrueA+FalseA),Preision_B = TrueB/(TrueB+FalseB)
召回率: 表示每一個(gè)類別預(yù)測(cè)正確的數(shù)量占真正為該類別的數(shù)量的比例
Recall_A = TrueA/(TrueA+FalseB)
F1指標(biāo): 精確率和召回率的調(diào)和平均數(shù), 如果兩個(gè)指標(biāo)相近,那么調(diào)和平均數(shù)的值就大
F1_A = 2/(1/Precision_A + 1/Recall_A)
【注意】在評(píng)測(cè)一個(gè)模型的時(shí)候如果某個(gè)標(biāo)簽精確率和召回率偏差過(guò)大,則該模型在預(yù)測(cè)該類別的時(shí)候的預(yù)測(cè)結(jié)果就不具備參考價(jià)值
-
分類問(wèn)題: 混淆矩陣
from sklearn.metrics import classification_reportprint(classification_report(y_pre, y_test)) -
回歸問(wèn)題: 均方誤差 平均絕對(duì)誤差
from sklearn.metrics import mean_absolute_error,mean_squared_errormean_absolute_error(y_,b_y_test)mean_squared_error(y_,b_y_test)
交叉驗(yàn)證
from sklearn.model_selection import cross_val_score
# 實(shí)例化算法模型
knn = KNeighborsClassifier()
dt = DecisionTreeClassifier()
# 輸出劃分對(duì)應(yīng)類別時(shí)的準(zhǔn)確率
cross_val_score(dt, data, target)
cross_val_score(knn, data, target)
# 根據(jù)需求選取更適合的算法</pre>
網(wǎng)格搜索算法參數(shù)調(diào)優(yōu)
from sklearn.model_selection import GridSearchCV
?
# K近鄰分類模型
GridSearchCV(knn,param_grid={"n_neighbors": [i for i in range(1, 21)]})
# 嶺回歸模型
GridSearchCV(ridge,param_grid={"alpha": [10**i for i in range(-20, 6)]})
# 邏輯斯蒂分類模型
GridSearchCV(lgs,param_grid={"C":[10**i for i in range(-3, 2)]})
# 梯度下降模型 可以調(diào)節(jié)學(xué)習(xí)率 alpha
# 決策樹(shù)模型 通過(guò)調(diào)節(jié) max_depth 最大深度
# 支持向量機(jī)
GridSearchCV(svc,param_grid={"C":[0.5,1.0,3,5,2],"kernel":["poly","rbf"],"gamma":[0.1,0.2,0.5,1,2]})
'''
C懲罰參數(shù)(懲罰參數(shù)越大,懲罰程度越大, 容錯(cuò)率越?。?kernel,核函數(shù),決定模型是線性還某種非線性,linear、rbf、poly、sigmoid、precomputed 例如rbf核函數(shù):exp(-gamma|u-v|^2) sigmoid核函數(shù):1/(1+ e^(-gamma*Z))
gamma,即是核函數(shù)的參數(shù)值,默認(rèn)是auto,則選擇1/n_feature
'''
?
gsc.best_estimator_ # 最優(yōu)參數(shù)組合的模型</pre>