2019-03-01

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ù)組是行向量)

  1. 創(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ù)
  2. 屬性
    ndim 維度
    size 大小
    shape 形狀
    dtype 數(shù)據(jù)類型
    itemsize 每個(gè)元素的字節(jié)數(shù) (float雙精度的浮點(diǎn)64位 8個(gè)字節(jié), 布爾類型一個(gè)字節(jié))
    data 內(nèi)存地址
  3. ndarray的基本操作
    1. 索引
      所有的列表索引方式, 數(shù)組都使用 a = np.array([[1, 2, 3], [4, 5, 6]])
      列表索引方式 a[0][0]
      數(shù)組特有的索引方式 a[0, 1]a[[1, 0, 1]]
    2. 切片
      a[起始 : 終止 : 步長(zhǎng)]
      步長(zhǎng)為正: 從前向后切,
      步長(zhǎng)為負(fù): 從后向前切,
    3. 變形
      1. 變形前后size值保持一致
      2. reshape(size=())把原來(lái)的數(shù)組copy出一個(gè)副本對(duì)副本進(jìn)行變形并返回
      3. resize(size=())直接在原數(shù)組上進(jìn)行變形
    4. 級(jí)聯(lián)
      1. 維度一致才能級(jí)聯(lián)
      2. 形狀相符才能級(jí)聯(lián)(將axis的取值所在維度蓋住看其他維度是否形狀一致)
      3. axis 指定級(jí)聯(lián)的方向
        針對(duì)于矩陣還有hstack()vsrack()
        h 是把二維數(shù)組變成一維(行向量)
        v 是把一維數(shù)組變成 n 行 1 列的二維數(shù)組(列向量)
    5. 切分
      split(數(shù)組, [切分點(diǎn), ... ...], axis=0 )
      vsplit縱向上切 切的是0維度
      hspilt橫向上切 切的是1維度
  4. 矩陣運(yùn)算
    1. 矩陣與矩陣 + - (兩個(gè)矩陣之間形狀size要一致)
    2. 矩陣與矩陣乘np.dot() 矩陣乘分為點(diǎn)乘(內(nèi)積)和叉乘(外積)
    3. 矩陣與常數(shù) * /
    4. 廣播機(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ò)充
  5. 數(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

  1. 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})
  • 索引與切片
    • 顯示索引(即用 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)
  • 基本操作
    • 屬性: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)算
  1. 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]
  2. 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,
  3. 數(shù)據(jù)的過(guò)濾與清晰
    • 缺失值的處理
      標(biāo)準(zhǔn)的python缺失值np.nan
      檢測(cè)具體某個(gè)位置的缺失 isnull()notnull()any()all() 配合使用
      • 過(guò)濾 dropna(axis=0)
      • 填充 fillna() 用具體值填充, 向前填充, 向后填充
    • 異常值的處理
      在實(shí)際業(yè)務(wù)中規(guī)定某些范圍的值就是異常值, 處理異常值也要根據(jù)實(shí)際業(yè)務(wù)(刪除、 修正)
    • 重復(fù)值(行)
      不是第一次出現(xiàn)的都是重復(fù)
  4. 層次化索引
    • 層次化索引創(chuàng)建
    • 層次化索引的查找與切片
      只有暴露在最外層的索引才能直接查找與切片
    • 索引堆
      stack()unstack()
      stack(level = -1) level 等于哪一層次, 她就會(huì)消失出現(xiàn)在列中
      unstack(level = -1) level 等于哪一層次, 她就會(huì)消失出現(xiàn)在列中
  5. 拼接
    • 級(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'])
    • 合并
      和并要求兩個(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=['名字'])
  6. 映射
    在一個(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)
  1. 分組聚合
    df.groupby['color'][['price']].sum() 按顏色求價(jià)格的和
  2. 繪圖
    折線圖、 柱狀圖、 直方圖、概率密度曲線
scipy

高端科學(xué)計(jì)算工具包

  1. 傅里葉變換 fft()
    過(guò)濾高頻信號(hào)
  2. 微積分 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>
  1. 圖像處理
    移動(dòng) shift() 旋轉(zhuǎn) rotate() 縮放zoom()
    高斯濾波 from scipy import ndimage ndimage.gaussian_filter()
    中位數(shù)濾波 ndimage.median_filter()
    signal維納濾波 from scipy import signal signal.wiener(moon, size=5)
matplotlib
  1. 圖形基礎(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圖形

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 主成分分析法
  • 性能
    • 完成既定任務(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)

深度學(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-近鄰算法的原理
    1. 求某個(gè)樣本點(diǎn)到所有已知樣本點(diǎn)之間的距離, 得到 d1, d2, ... ... dn
    2. 對(duì)以上的距離進(jìn)行從小到大的排序
    3. 對(duì)以上排序完的那些距離取前K個(gè)( <=20 )
    4. 對(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>
  1. 線性方程
    y = w1x1 + w2x2 + ... ... + wnxn + b
    令 W = (w1, w2 ... ... wn), X = (x1, x2, ... ... xn)
    則 y = W * X ^ T + b
    稱 W 為回歸系數(shù), X 為特征向量, b 為截距
  2. 線性方程的推導(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)大于特征維度), 所以上述方案行不通
  3. 最小二乘法
    • 假設(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ì)值

邏輯斯蒂

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ù)條切線, 其中梯度方向的切線是下降最快的

    1. 求偏導(dǎo)數(shù)

      δz/δx 對(duì) x 的偏導(dǎo)數(shù) 2x ; δz/δy 對(duì) y 的偏導(dǎo)數(shù) 2x

    2. 梯度方向向量

      (δz/δx, δz/δy) = (2x, 2y)

    梯度下降的過(guò)程:

    • 二維空間 J(x) = x ^ 2

      1. 求梯度: 二維空間的梯度就是微分 J(x)' = 2x

      2. 初始化一個(gè)起始點(diǎn) x0

      3. 設(shè)置學(xué)習(xí)步長(zhǎng)(學(xué)習(xí)率) α = 0.4

      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

      1. 求梯度 (2x, 2y)

      2. 設(shè)置起始點(diǎn) p0(3, 4)

      3. 設(shè)置學(xué)習(xí)率 α = 0.1

      4. 迭代下降

        p1 = p0 - 0.1 * (2 * 3, 2 * 4) = (2.4, 3.2)

        ... ...

樸素貝葉斯

from sklearn.naive_bayes import GaussianNB, MultionmialNB, BernoulliNB

高斯, 多項(xiàng)式文本分類, 伯努利文本分類多適用于小型文本,

  1. 條件概率

    P(A|B) = P(AB) / P(B) <===> P(AB) = P(A|B)P(B)

    在 B 已經(jīng)發(fā)生的基礎(chǔ)上 A 發(fā)生的概率, A 和 B 是相互獨(dú)立事件

  2. 全概率

    全概率公式表達(dá)的是由因溯果

  3. 貝葉斯公式

    由果溯因, 事件已經(jīng)發(fā)生, 推測(cè)是哪個(gè)因素造成的

  4. 樸素貝葉斯分類器基于貝葉斯理論及其假設(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ù)算法

  1. 決策樹(shù)的定義:
    用非葉子表示模型的特征

    用葉子節(jié)點(diǎn)來(lái)表示標(biāo)簽

    每一個(gè)分支都是當(dāng)前特征在特定值域上的輸出

  2. 如何構(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 算法:
  1. 也叫分類回歸樹(shù), 既能分類有能回歸

    CART是一顆二叉樹(shù)

    如果是CART分類樹(shù), 采用GINI值來(lái)作為節(jié)點(diǎn)分裂的依據(jù);如果是CART回歸樹(shù), 采用樣本的最小方差作為節(jié)點(diǎn)的分裂依據(jù)

  2. 如何選擇分裂屬性

  • 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è)的性能就越低
    
  1. 如何分裂成一顆二叉樹(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ì)

    1. 正則化

    2. 并行處理

    3. 高度靈活:用戶自定義優(yōu)化目標(biāo)和評(píng)價(jià)標(biāo)準(zhǔn)

    4. 缺失值處理:內(nèi)置處理缺失值的規(guī)則,XGBoost在不同節(jié)點(diǎn)遇到缺失值時(shí)采用不同的處理方法。并且會(huì)學(xué)習(xí)未來(lái)遇到缺失值時(shí)的處理方法。

    5. 剪枝:黨分裂遇到付損失時(shí)GBDT會(huì)提u能告知分裂,因此GBDT時(shí)貪心算法, XGBoost會(huì)一直分裂到指定的最大深度,然后回過(guò)頭剪枝。

    6. 內(nèi)置交叉驗(yàn)證:在每一輪迭代中使用交叉驗(yàn)證,可以方便獲得最優(yōu)迭代次數(shù),而GBDT是用網(wǎng)格搜索智能檢測(cè)有限個(gè)值。

    7. 在已有的模型基礎(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ù)

  1. 樣本隨機(jī): 從樣本中隨機(jī)有放回的抽取 n 個(gè)樣本(樣本有重復(fù))

  2. 特征隨機(jī): 從所有的屬性中隨機(jī)選取 k 個(gè)屬性, 選擇最佳的分割屬性作為節(jié)點(diǎn)建立決策樹(shù)

  3. 重復(fù)以上步驟 m 次, 即建立 m 棵CART決策樹(shù)

  4. 這 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

  • 算法步驟

    1. 在整個(gè)樣本群中定義 K 個(gè)種子點(diǎn)、

    2. 分別計(jì)算每個(gè)樣本點(diǎn)到所有種子點(diǎn)的歐式距離, 標(biāo)記最小的距離為該種子點(diǎn)代表的簇

    3. 當(dāng)所有樣本點(diǎn)類簇的歸屬全部劃分完成后, 把每一個(gè)種子點(diǎn)移動(dòng)到其所代表的那個(gè)類簇點(diǎn)群的幾何中心

    4. 重復(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_score

    adjusted_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)積和投影

    1. 內(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

    2. 向量?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 上的投影

    3. 向量基

      在一個(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]]

    1. 讓每一個(gè)特征減去這個(gè)特征上所有值的平均值

      [[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]]

    2. 求去平均值以后的矩陣的協(xié)方差

      方差: 每個(gè)樣本與均值的差的平方和除以樣本個(gè)數(shù)

      協(xié)方差: Cov = (1/m)X*X^T = 1/5([6, 5], [4, 6])

    3. 求協(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ì)角化

    4. 將特征值按照從大到小的順序排列, 取前K個(gè)特征值對(duì)應(yīng)的特征向量, 就構(gòu)成了K維的主成分空間即 P

    5. 降維, 對(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>

目的:

  1. 對(duì)于方差較小的屬性可以增加其穩(wěn)定性,
  2. 維持稀疏矩陣中0的條目,
  3. 防止過(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_report

    print(classification_report(y_pre, y_test))

  • 回歸問(wèn)題: 均方誤差 平均絕對(duì)誤差

    from sklearn.metrics import mean_absolute_error,mean_squared_error

    mean_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>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容