2019-03-01

Data Analysis

算法基礎(chǔ), 工具框架算法模型的選擇使用, 業(yè)務(wù)方面(金融等)
需要掌握 算法推導(dǎo)過程
了解大數(shù)據(jù)系統(tǒng) (架構(gòu)層商膊, 算法是核心層)
數(shù)據(jù)獲取途徑: 爬蟲, 大數(shù)據(jù)架構(gòu)宠进, 購買
數(shù)據(jù)挖掘(numpy晕拆, pandas, matplotlib ... ...)----
圖像識別(在物聯(lián)網(wǎng)中的應(yīng)用砰苍, 無人駕駛技術(shù)潦匈, 自動泊車) 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ù)組對象(數(shù)組中的元素類型都一致)
    ? 列表在雙肩數(shù)組的時候需要每個維度上的元素個數(shù)保持一致
    (2) 內(nèi)建函數(shù)
    ? ones()
    ? zeros()
    ? full()
    ? eye() 對角線上為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 隨機浮點數(shù)
  2. 屬性
    ndim 維度
    size 大小
    shape 形狀
    dtype 數(shù)據(jù)類型
    itemsize 每個元素的字節(jié)數(shù) (float雙精度的浮點64位 8個字節(jié)茬缩, 布爾類型一個字節(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[起始 : 終止 : 步長]
      步長為正: 從前向后切吼旧,
      步長為負(fù): 從后向前切凰锡,
    3. 變形
      1. 變形前后size值保持一致
      2. reshape(size=())把原來的數(shù)組copy出一個副本對副本進行變形并返回
      3. resize(size=())直接在原數(shù)組上進行變形
    4. 級聯(lián)
      1. 維度一致才能級聯(lián)
      2. 形狀相符才能級聯(lián)(將axis的取值所在維度蓋住看其他維度是否形狀一致)
      3. axis 指定級聯(lián)的方向
        針對于矩陣還有hstack()vsrack()
        h 是把二維數(shù)組變成一維(行向量)
        v 是把一維數(shù)組變成 n 行 1 列的二維數(shù)組(列向量)
    5. 切分
      split(數(shù)組, [切分點, ... ...], axis=0 )
      vsplit縱向上切 切的是0維度
      hspilt橫向上切 切的是1維度
  4. 矩陣運算
    1. 矩陣與矩陣 + - (兩個矩陣之間形狀size要一致)
    2. 矩陣與矩陣乘np.dot() 矩陣乘分為點乘(內(nèi)積)和叉乘(外積)
    3. 矩陣與常數(shù) * /
    4. 廣播機制原則
      • 當(dāng)向量或者常數(shù)與矩陣進行運算的時候, 可以把向量或者常數(shù)補全成矩陣的形狀
      • 我們可以把一個常數(shù)按照任何一個矩陣的形狀進行擴充
      • 向量和矩陣相加減(要求: 如果是行向量那么元素的個數(shù)要和矩陣的列數(shù)一致圈暗, 因為按行擴充)(如果是列向量掂为, 那么行數(shù)要和矩陣的行數(shù)一致, 按列擴充)员串, 根據(jù)行數(shù)或者列數(shù)把向量進行擴充
  5. 數(shù)組的聚合
    • 完全聚合: 不指定 axis 的值勇哗, 則把所有的數(shù)據(jù)聚合在一起
    • 聚合時將 np.nan 剔除
    • 指定軸聚合: 用 axis 來指定對哪些維度進行聚合
      • axis 值等于哪個維度, 這個維度就會消失寸齐, 取而代之的是把這個維度上的子元素進行某種聚合的結(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在查找的時候既可以用下標(biāo)(隱式索引)來查找又可以用 index(顯式索引)來查找

  • 創(chuàng)建
    • 用數(shù)組或者列表來創(chuàng)建
      創(chuàng)建的時候要指定 values 部分對應(yīng)的內(nèi)容和 index 部分對應(yīng)的內(nèi)容, values就是數(shù)組或列表種具體的值毅厚, index 的值如果不指定塞颁, 默認(rèn)會把數(shù)組的下標(biāo)設(shè)置為 index, 如果指定, 制定的時候 index 的個數(shù)和 values 的個數(shù)保持一致
      s = pd.series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
    • 用字典來創(chuàng)建
      系統(tǒng)會把字典的所有的值 copy 出放在 values 部分祠锣, 所有鍵 copy 出放在對應(yīng)的index部分酷窥, 字典的除了自帶的index 以外, 也可以指定 index锤岸, 這個指定的 index 可以和原字典的 index 不保持一致竖幔, 不一致的地方會設(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]
    • 隱式切片(實質(zhì)上切實calues數(shù)組)
      s.iloc[0: 2]
    • 顯示切片(對 index 進行切)
      s.loc['a': 'c'] 注意: c如果重復(fù)切不連續(xù), 則不能以c為切片的斷點
  • 基本操作
    • 屬性:shape是偷, size拳氢, index, values蛋铆, name
    • 確實檢測: isnull(), notnull()
    • 擴展: 有 seriesA 和 seriesB 馋评, A 和 B 的 index 完全一致但是 B 的 values全是boolean, 那么 B 可以作為 A 的索引使用刺啦, 此時輸出的內(nèi)容是B 中為True的那些索引對應(yīng)的內(nèi)容
  • Series 的運算
    • 適合 numpy 的運算都適合 Series
    • Series 之間的運算
      索引對應(yīng)的那些元素的值進行數(shù)學(xué)運算留特, 運算的結(jié)果還對應(yīng)相關(guān)索引
      如果索引 index 不對應(yīng)情況, 將缺失的 index 補充 NAN 在進行運算
  1. DataFrame 數(shù)據(jù)表
    結(jié)構(gòu): index玛瘸、 column蜕青、 values 分別代表行索引, 列索引糊渊, 值
    一個DataFrame 由多個Series構(gòu)成右核, 按行的話, 每一行都是一個Series渺绒, 如果按列贺喝, 每一列都是一個Series
    • 創(chuàng)建
      • 數(shù)組: 指定index, colunms 和 values
      • 字典: 每個鍵值對應(yīng)的是一列宗兼, 鍵代表這一列的列索引躏鱼, 值代表這個列名下對應(yīng)的那些值
        df = DataFrame({'a': [1, 2, 3, 4], 'b':[3, 4, 5, 6], 'c':[1, 5, 7, 8]})
    • 索引與切片
      • 索引列
        列不能直接用列名進行切片 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] 這是錯誤的 不允許先列后行
      df.loc[0, 'a']
      df.loc[::, 'a':'c']
      df.iloc[::, 0: 2]
  2. DataFrame 的運算
    • DataFrame之間的運算
      遵從自動補全機制
    • DataFrame 和 Series 之間的運算
      如果Series 的 index 是行索引 在運算的時候要指定 axis 為 0,
      如果 Series的 index 是列索引 在運算的時候要指定 axis 為 1殷绍,
  3. 數(shù)據(jù)的過濾與清晰
    • 缺失值的處理
      標(biāo)準(zhǔn)的python缺失值np.nan
      檢測具體某個位置的缺失 isnull()notnull()any()all() 配合使用
      • 過濾 dropna(axis=0)
      • 填充 fillna() 用具體值填充染苛, 向前填充, 向后填充
    • 異常值的處理
      在實際業(yè)務(wù)中規(guī)定某些范圍的值就是異常值主到, 處理異常值也要根據(jù)實際業(yè)務(wù)(刪除殖侵、 修正)
    • 重復(fù)值(行)
      不是第一次出現(xiàn)的都是重復(fù)
  4. 層次化索引
    • 層次化索引創(chuàng)建
    • 層次化索引的查找與切片
      只有暴露在最外層的索引才能直接查找與切片
    • 索引堆
      stack()unstack()
      stack(level = -1) level 等于哪一層次, 她就會消失出現(xiàn)在列中
      unstack(level = -1) level 等于哪一層次镰烧, 她就會消失出現(xiàn)在列中
  5. 拼接
    • 級聯(lián) pd.concat([df1, df2], axis=0)
      • 簡單級聯(lián)
        對行級聯(lián), 列名一致
      • 不匹配級聯(lián)
        對行級聯(lián)楞陷, 列名不一致
        內(nèi)連接join='outer'(不匹配的補nan)怔鳖, 外連接join='inner'(不匹配的去掉), 指定軸鏈接join_axes=[df1.columns](只保留指定的軸)join_axes=[pd.Index(['A', 'C'])
    • 合并
      和并要求兩個二維表有一個或者多個公共屬性固蛾, 用公共屬性作為合并的key值進行拼接结执;如果兩個表沒有公共屬性那么不能直接合并
      • 一對一 df1.merge(df2)
      • 一對多 把一個復(fù)制成多份 再合并
      • 多對多 組合
        如果出現(xiàn)不匹配的情況則
      • 內(nèi)合并:how='inner' 不匹配的部分剃掉
      • 外合并: 不匹配的地方補nan
      • 左合并: 按左邊為基準(zhǔn)合并
      • 右合并:
        多個公共屬性時
      • 指定以某一屬性為key df1.merge(df2, on=['name'], suffixes=['age1', 'age2'])
        沒有公共屬性時
      • df1.merge(df2, left_on=['name'], right_on=['名字'])
  6. 映射
    在一個關(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({'原來的元素': '替換的元素'})
根據(jù)已知列映射出新列 df['新的列名'] = df['已存在的列名'].map({'已存在列的元素': '映射結(jié)果'})

def func(x):
         if x > 60 :
         return '及格'
         else:
         return '不及格'
        # df['是否及格']  = df['成績'].map(func)
  1. 分組聚合
    df.groupby['color'][['price']].sum() 按顏色求價格的和
  2. 繪圖
    折線圖献幔、 柱狀圖懂傀、 直方圖、概率密度曲線
scipy

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

  1. 傅里葉變換 fft()
    過濾高頻信號
  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. 圖像處理
    移動 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曲線
      單個 plot() 參數(shù)傳一個數(shù)組或者兩個數(shù)組
      多條: 用多個 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挽拔、 散點圖 plt.scatter辆脸、 玫瑰圖(極坐標(biāo))
    • 3D圖形

Machine learning

  • 經(jīng)驗
    經(jīng)驗即是數(shù)據(jù), 客觀世界中一切事物都可以用數(shù)據(jù)來表示篱昔, 一般情況我們表示客觀食物的時候每强, 習(xí)慣用他們的一些特征量化描述, 一般這些特征可以組合成一個向量州刽, 即特征向量
    數(shù)據(jù)是機器學(xué)習(xí)的基礎(chǔ)
  • 任務(wù)
    根據(jù)數(shù)據(jù)模型和算法模型的不同可以將機器學(xué)習(xí)氛圍監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)
    • 監(jiān)督學(xué)習(xí)
      主要任務(wù)(理念): 利用現(xiàn)有數(shù)據(jù)推測未知數(shù)據(jù)
      數(shù)據(jù)特點: 數(shù)據(jù)有兩部分空执, 即特征數(shù)據(jù)和標(biāo)簽數(shù)據(jù)
      • 分類: 標(biāo)簽數(shù)據(jù)是離散的, 相互無關(guān)聯(lián)的穗椅, 明確的(水果種類)
      • 回歸: 標(biāo)簽數(shù)據(jù)是連續(xù)的辨绊, 相互關(guān)聯(lián)的, 不明確的(房價)
        算法: K-近鄰匹表、線性回歸器门坷、 邏輯斯蒂回歸、 樸素貝葉斯袍镀、 決策樹默蚌、 隨機森林、 SVM ... ...
    • 無監(jiān)督學(xué)習(xí)
      對客觀事物本身的特征進行分析與認(rèn)知
      數(shù)據(jù)特點: 只有特征數(shù)據(jù)
      • 聚類: K-Means(根據(jù)指標(biāo)苇羡,簇之間的離散程度和聚合程度達(dá)到最優(yōu))
      • 特征降維: PCA 主成分分析法
  • 性能
    • 完成既定任務(wù)的質(zhì)量的評測指標(biāo):
      分類問題: 準(zhǔn)確率绸吸, 精準(zhǔn)率, 召回率, F1指標(biāo)
      回歸問題: 均方誤差锦茁, 平均絕對誤差
    • 性能調(diào)優(yōu)
      從數(shù)據(jù)上: 數(shù)據(jù)的正則化攘轩, 數(shù)據(jù)的標(biāo)準(zhǔn)化 ... ...
      從算法上: 不同的算法通過調(diào)參進行性能調(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. 求某個樣本點到所有已知樣本點之間的距離稿存, 得到 d1, d2, ... ... dn
    2. 對以上的距離進行從小到大的排序
    3. 對以上排序完的那些距離取前K個( <=20 )
    4. 對這前K個距離對應(yīng)的標(biāo)簽進行分析笨篷, 如果某個標(biāo)簽占優(yōu)勢, 那么未知點就歸屬于這個標(biāo)簽
  • 優(yōu)缺點
    優(yōu)點: 精度高挠铲, 算法簡單冕屯, 無需輸入假定數(shù)據(jù)
    缺點: 時間復(fù)雜度 和 空間復(fù)雜度 高
  • 回歸模型的原理是計算K近鄰歐氏距離的平均值進行擬合回歸

LinearRegression *

from sklearn.linear_model import LinearRegression

lr = LinearRegression(fit_intercopt=True, noemalize=False, copy_X=True, n_jobs=None)
# fit_intercopt 是否計算截距
# noemalize在計算拮據(jù)的情況下, 回歸前歸一化拂苹, 回歸因子X為減去均值,除以L2范數(shù)
# copy_X復(fù)制或覆蓋
# n_jobs 采用多少CPU計算 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 個已知樣本浴韭, 每個樣本有 n 個特征記為 X1, X2, ... ... , Xm 每個X中都有 n 個 x
    對應(yīng)的標(biāo)簽記為: y1, y2, ... ... , ym ,且特征和標(biāo)簽成線性關(guān)系
    此時只要求得 W 就可得到線性回歸方程
    ? 將m個已知量帶入方程會得到方程組:
    ? 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 且無共線脯宿, 方程無解
    ? m = n 且無共線念颈, 有且只有一個解
    ? m < n 無數(shù)個解
    ? 在實際生產(chǎn)環(huán)境中 m >> n (樣本數(shù)遠(yuǎn)遠(yuǎn)大于特征維度), 所以上述方案行不通
  3. 最小二乘法
    • 假設(shè) W’ 和 b‘ 是最合適的连霉, 得到假設(shè)出來的回歸方程: W‘ * X ^ T + b’
    • 把所有的樣本帶入榴芳, 得到假設(shè)的那些標(biāo)簽數(shù)據(jù):
      y1' = W' * X1 ^ T + b'
      y2' = W' * X2 ^ T + b'
      ... ...
      ym' = W' * Xm ^ T + b'
      此時 y1', y2', ... .. , ym' 都是通過假設(shè)的 W' 和 b‘ 得到的標(biāo)簽, 那么真實的標(biāo)簽 y1, y2, ... .. , ym 和假設(shè)推導(dǎo)的標(biāo)簽之間一定存在差異
    • 求真實的標(biāo)簽和假設(shè)推導(dǎo)的標(biāo)簽之間存在的差異 (因為差異有正負(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
    • 求差異的最小值
      對 H 求導(dǎo) 為 0 得到極小值點
      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是單位矩陣(對角線為1)窟感, λ為縮減系數(shù)】
        此時 W‘ 的值除了受已知數(shù)據(jù)的影響以外還受 λ 的影響
        W' = (X^T * X + λI)^(-1) * X^TY * X
        from sklearn.linear_model import Ridge 改良的最小二乘法
        1.嶺回歸可以解決特征數(shù)量比樣本量多的問題
        2.嶺回歸作為一種縮減算法可以判斷哪些特征重要或者不重要,有點類似于降維的效果
        3.縮減算法可以看作是對一個模型增加偏差的同時減少方差
        嶺回歸用于處理下面兩類問題:
        1.數(shù)據(jù)點少于變量個數(shù)
        2.變量間存在共線性(最小二乘回歸得到的系數(shù)不穩(wěn)定歉井,方差很大)
      • from sklearn.learn_model import Lasso
        羅斯回歸與嶺回歸的區(qū)別是羅斯回歸采用L1正則:懲罰系數(shù)的絕對值

邏輯斯蒂

from sklearn.learn_model import LogisiticRegression
計算量非常小柿祈,速度很快,存儲資源低哩至,缺點就是因為模型簡單躏嚎,對于復(fù)雜的情況下會出現(xiàn)欠擬合,并且只能處理2分類問題菩貌, 信用評測卢佣, 營銷活動成功率概率, 產(chǎn)品銷售預(yù)測箭阶,

? 特征向量: X = (x1, x2, ... ... , xn)

? 回歸系數(shù): W = (w1, w2, ... ... , wn)

? 截距: b

? 標(biāo)簽: Y

? 如果 Y 和 X 成線性關(guān)系珠漂, 且 Y 是連續(xù)的晚缩, 則可以表示成: Y = W * X ^ T + b

  • 二分類問題: 在實數(shù) R 的范圍內(nèi)把 Y 進行二分類, 即把 Y 映射到集合{0, 1}中, 把 Y 映射到(0, 1) 區(qū)間中媳危, 然后進行二分類。(例如糖尿病案例中的標(biāo)簽是醫(yī)學(xué)指標(biāo)需要使用單位階躍函數(shù)轉(zhuǎn)為二分類問題)

    現(xiàn)在需要找到一個函數(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

    選擇分類點: 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))

    此時 g(x) 是 推導(dǎo)的標(biāo)簽 是離散的 因此不能用最小二乘法

  • 最大似然估計

    X1 對應(yīng) Y1 這件事發(fā)生的概率, 記為 P(X=X1, Y=Y1)

    ... ...

    Xm 對應(yīng) Ym 這件事發(fā)生的概率癌压, 記為 P(X=Xm, Y=Ym)

    目標(biāo): 求上述事件(相互獨立)同時發(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)過于麻煩仰泻, 引入 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有一個值, 如果有多個值則引入梯度下降或擬牛頓法求解)

  • 梯度下降 (常用于優(yōu)化算法滩届,線性收斂的隨機優(yōu)化算法)

    from sklearn.learn_model import SGDClassifier

    梯度的方向是最大方向?qū)?shù)的方向

    • 二維空間中

      y = x ^ 2

      微分 dy = dx ^ 2 = 2x dx

      在點(1, 1) 處dy = 2 即為切線的斜率 集侯, 下降最快的方向

    • 三維空間中

      z = x ^ 2 + y ^ 2

      過三維曲面中的某個點可以做無數(shù)條切線, 其中梯度方向的切線是下降最快的

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

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

    2. 梯度方向向量

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

    梯度下降的過程:

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

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

      2. 初始化一個起始點 x0

      3. 設(shè)置學(xué)習(xí)步長(學(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è)置起始點 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

高斯, 多項式文本分類娄猫, 伯努利文本分類多適用于小型文本贱除,

  1. 條件概率

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

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

  2. 全概率

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

  3. 貝葉斯公式

    由果溯因媳溺, 事件已經(jīng)發(fā)生月幌, 推測是哪個因素造成的

  4. 樸素貝葉斯分類器基于貝葉斯理論及其假設(shè)(即特征之間是獨立的砌左,互不相互影響的)

    P(A|B) = P(B|A)P(A) / P(B)

    P(A|B) 是后驗概率盹愚, P(B|A)是似然 P(A)是先驗概率 ,P(B)是預(yù)測的值

    具體應(yīng)用: 垃圾郵件檢測遭商, 文章分類屯阀, 情感分類缅帘, 人臉識別

SVM *

from sklearn.svm import SVC, SVR

在N維空間找到一個(N-1)維的超平面將樣本空間分為兩類。

具體應(yīng)用: 廣告展示难衰, 性別檢測钦无, 大規(guī)模圖像識別

通過核函數(shù),支持向量機可以將特征向量映射到更高維的空間中盖袭,是的原本線性不可分的數(shù)據(jù)在映射之后的空間中變得線性可分失暂。

在是顯示不需要直接對特征向量做映射彼宠,耳式用核函數(shù)對兩個特征響亮的內(nèi)積進行變換,這樣做等價于先對箱量進行映射然后做內(nèi)積弟塞。

[圖片上傳失敗...(image-3f220a-1551434906070)]

決策樹 *

from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor

線性結(jié)構(gòu)(列表 棧 隊列)凭峡、 散列結(jié)構(gòu) 、 樹形結(jié)構(gòu) (至多有一個前驅(qū)决记, 可以有多個后繼) 摧冀、 網(wǎng)絡(luò)結(jié)構(gòu)(有方向的圖)

  • 參數(shù)說明
 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")
     一種用來在節(jié)點中選擇分類的策略扩借。支持的策略有"best"椒惨,選擇最好的分類,"random"選擇最好的隨機分類潮罪。
    ?
    max_features:int,float,string or None 可選(默認(rèn)為None)
     在進行分類時需要考慮的特征數(shù)康谆。
     1.如果是int,在每次分類是都要考慮max_features個特征错洁。
     2.如果是float,那么max_features是一個百分率并且分類時需要考慮的特征數(shù)是int(max_features*n_features,其中n_features是訓(xùn)練完成時發(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
     注意:至少找到一個樣本點有效的被分類時屯碴,搜索分類才會停止描睦。
    ?
    max_depth:int or None,可選(默認(rèn)為"None")
     表示樹的最大深度。如果是"None",則節(jié)點會一直擴展直到所有的葉子都是純的或者所有的葉子節(jié)點都包含少于min_samples_split個樣本點导而。忽視max_leaf_nodes是不是為None忱叭。
    ?
    min_samples_split:int,float,可選(默認(rèn)為2)
     區(qū)分一個內(nèi)部節(jié)點需要的最少的樣本數(shù)。
     1.如果是int今艺,將其最為最小的樣本數(shù)韵丑。
     2.如果是float,min_samples_split是一個百分率并且ceil(min_samples_split*n_samples)是每個分類需要的樣本數(shù)虚缎。ceil是取大于或等于指定表達(dá)式的最小整數(shù)撵彻。
    ?
    min_samples_leaf:int,float,可選(默認(rèn)為1)
     一個葉節(jié)點所需要的最小樣本數(shù):
     1.如果是int,則其為最小樣本數(shù)
     2.如果是float实牡,則它是一個百分率并且ceil(min_samples_leaf*n_samples)是每個節(jié)點所需的樣本數(shù)陌僵。
    ?
    min_weight_fraction_leaf:float,可選(默認(rèn)為0)
     一個葉節(jié)點的輸入樣本所需要的最小的加權(quán)分?jǐn)?shù)。
    ?
    max_leaf_nodes:int,None 可選(默認(rèn)為None)
     在最優(yōu)方法中使用max_leaf_nodes構(gòu)建一個樹创坞。最好的節(jié)點是在雜質(zhì)相對減少碗短。如果是None則對葉節(jié)點的數(shù)目沒有限制。如果不是None則不考慮max_depth.
    ?
    class_weight:dict,list of dicts,"Banlanced" or None,可選(默認(rèn)為None)
     表示在表{class_label:weight}中的類的關(guān)聯(lián)權(quán)值题涨。如果沒有指定偎谁,所有類的權(quán)值都為1总滩。對于多輸出問題,一列字典的順序可以與一列y的次序相同巡雨。
     "balanced"模型使用y的值去自動適應(yīng)權(quán)值闰渔,并且是以輸入數(shù)據(jù)中類的頻率的反比例。如:n_samples/(n_classes*np.bincount(y))鸯隅。
     對于多輸出澜建,每列y的權(quán)值都會想乘。
     如果sample_weight已經(jīng)指定了蝌以,這些權(quán)值將于samples以合適的方法相乘。
    ?
    random_state:int,RandomState instance or None
     如果是int,random_state 是隨機數(shù)字發(fā)生器的種子何之;如果是RandomState跟畅,random_state是隨機數(shù)字發(fā)生器,如果是None溶推,隨機數(shù)字發(fā)生器是np.random使用的RandomState instance.
    ?
    persort:bool,可選(默認(rèn)為False)
     是否預(yù)分類數(shù)據(jù)以加速訓(xùn)練時最好分類的查找徊件。在有大數(shù)據(jù)集的決策樹中,如果設(shè)為true可能會減慢訓(xùn)練的過程蒜危。當(dāng)使用一個小數(shù)據(jù)集或者一個深度受限的決策樹中虱痕,可以減速訓(xùn)練的過程。
    '''
    decision_tree.feature_importances_  # 查看屬性的重要性
    ?
    繪制一棵決策樹 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>

決策樹算法

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

    用葉子節(jié)點來表示標(biāo)簽

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

  2. 如何構(gòu)造以可決策樹

    關(guān)鍵: 屬性的分裂辐赞, 如何在某個節(jié)點處根據(jù)屬性的不同構(gòu)造不同的輸出

    理論基礎(chǔ): 信息論

    三種情況

    • 屬性是離散的并且不要求構(gòu)建二叉樹(有多少中取值就夠賤多少個分支)
    • 屬性是離散的需要構(gòu)建二叉樹(將離散的標(biāo)簽按照需求歸類)
    • 屬性是連續(xù)的(取若干個區(qū)間 將對應(yīng)的值劃分到區(qū)間中進行分類)
ID3 算法
  • 信息量 :
    如果參與分類的事物可以劃分到多個分類中去部翘, 記 X 為該信息, 則該信息的信息量為:(比如X可以劃分為n個類別响委, 則第i個類別的信息量為 L(xi) = -log2(P(xi)), P(xi)表示xi出現(xiàn)的概率)
    數(shù)學(xué)期望(mean)(或均值新思,亦簡稱期望)是試驗中每次可能結(jié)果的概率乘以其結(jié)果的總和,是最基本的數(shù)學(xué)特征之一赘风。它反映隨機變量平均取值的大小
  • 信息熵(香濃熵):
    H = L(X1)P(X1) + ... ... + L(Xn)P(Xn)
    例如: 11個人中5個貸款6個不貸款 H = -5/11 * log2(5/11) -6/11 * log2(6/11) = 0.994
  • 計算每一個特征 相對 類別的劃分 的熵:
    例如: 11個人中 3個自由職業(yè)者中有一個貸款夹囚, 4個工人1個貸款 4個白領(lǐng)3個貸款
    則: 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
  • 計算每一個特征的信息增益:
    信息熵 - 每個特征相對類別劃分的熵 = 0.994 - 0.840 = 0.154
    對計算的結(jié)果進行比較。
C4.5決策樹:

為了解決ID3決策樹的缺點:當(dāng)一個屬性值可取數(shù)目較多時邀窃, 那么可能這個屬性對應(yīng)的可取值下的樣本只有一個或者很少個荸哟, 此時信息增益非常高, ID3算法會認(rèn)為這個屬性非常適合用來劃分瞬捕, 但較多屬性來進行劃分帶來的問題是他的泛化能力很弱鞍历, 不能對新樣本進行有效的預(yù)測。

所以C4.5 采用信息增益率來作為劃分依據(jù):

但是增增益率會偏好取值數(shù)目較少的屬性山析, 因此C4.5決策樹會先從候選劃分屬性中找出信息增益高于平均水平的屬性堰燎,再從中選擇增益率最高的

CART 算法:
  1. 也叫分類回歸樹, 既能分類有能回歸

    CART是一顆二叉樹

    如果是CART分類樹笋轨, 采用GINI值來作為節(jié)點分裂的依據(jù)秆剪;如果是CART回歸樹赊淑, 采用樣本的最小方差作為節(jié)點的分裂依據(jù)

  2. 如何選擇分裂屬性

  • GINI 值的計算

      ?  GINI = 1 - [P1 ^ 2 + P2 ^ 2 + ... ... + Pn ^ 2]
    
      節(jié)點的純度越低, GINI 值越大 (越小屬性越重要)
    
  • 回歸方程的方差: δ = [(x1 - u) ^ 2 + (x2 - u) ^ 2 + ... ... + (xn - u) ^ 2] ^ 0.5

      方差越大仅讽, 數(shù)據(jù)越離散陶缺, 預(yù)測的性能就越低
    
  1. 如何分裂成一顆二叉樹

    ?

集成算法

ada,gbdt, xgboost 常用 max_depth = 6, 而 decision_tree , randomForest 常用 max_depth = 15

boosting 提升

學(xué)習(xí)器之間存在先后順序洁灵,初始時饱岸。每個樣本的權(quán)重相等,首先第一個學(xué)習(xí)器訓(xùn)練樣本進行學(xué)習(xí)徽千,學(xué)習(xí)完成后苫费,增大錯誤樣本的權(quán)重,同時減小正確樣本的權(quán)重双抽,再利用第二個學(xué)習(xí)期對其進行學(xué)習(xí)百框,依次進行下去,最終得到b個學(xué)習(xí)器牍汹。最終合并b個學(xué)習(xí)其的結(jié)果铐维,同時與bagging的不同的是,每個學(xué)習(xí)器的權(quán)重也不一樣慎菲。

Adaboost

from sklearn.ensemble import AdaBoostClassidier

重復(fù)選擇表現(xiàn)一般的模型嫁蛇,每次基于先前模型的表現(xiàn)進行調(diào)整, 不同的是 ada是通過提升數(shù)據(jù)點的權(quán)重來定位模型的不足露该,而gbdt是通過算梯度定位模型的不足睬棚,因此 gbdt可使用更多種類的不妙函數(shù),而這主要區(qū)別在于 識別模型的問題有决,ada用錯分?jǐn)?shù)據(jù)來識別問題闸拿,通過調(diào)整錯分?jǐn)?shù)據(jù)的權(quán)重來進行模型的改進。 gbdt梯度提升樹通過計算梯度來改進书幕。

GBDT

CART 作為基分類器新荤。

每棵樹學(xué)的是之前樹的殘差(預(yù)測值為前面所有樹累加的和)

后面的學(xué)習(xí)器糾正前面的所有若學(xué)習(xí)器的殘差,最終將多個學(xué)習(xí)器像加在一起用來進行最終的預(yù)測(每一次計算都是為了減少上一次的殘差台汇,即利用殘差學(xué)模型苛骨, 為了消除殘差,會在殘差減少的梯度方向上減少一個新的模型)

梯度提升樹 進行特征重要性排序

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 正則化項的LR或線性回歸。

xgboost,plot_importance(xgb) 顯示屬性重要性排序

xgboost.plot_tree(xgb, num_tree=0,ax=axes) 繪制索引為0的樹

構(gòu)造損失函數(shù): 真實值與預(yù)測值的 均方誤差/ 似然函數(shù)

求損失函數(shù)的最小值

用集成學(xué)習(xí)算法表示預(yù)測值 yi' = f1(xi) + f2(xi) + ... ... + fk(xi), f代表每一棵樹映射函數(shù)

找到最合適的 K

  • 原理 http://www.reibang.com/p/7467e616f227

    data = xgb.DMatrix ('data.txt')

    加載數(shù)據(jù)存在DMatrix對象中牵素,每一行代表一個樣本 有 屬性索引 和 屬性值

  • 優(yōu)勢

    1. 正則化

    2. 并行處理

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

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

    5. 剪枝:黨分裂遇到付損失時GBDT會提u能告知分裂请琳,因此GBDT時貪心算法粱挡, XGBoost會一直分裂到指定的最大深度,然后回過頭剪枝俄精。

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

    7. 在已有的模型基礎(chǔ)上繼續(xù)學(xué)習(xí)

  • 參數(shù)調(diào)優(yōu)https://www.cnblogs.com/mfryf/p/6293814.html

    • booster 選擇每次迭代的模型
      gbtree 基于樹的模型(默認(rèn))
      gbliner 線性模型

    • silent 但這個參數(shù)值為1時 靜默模式開啟 不會輸出任何信息嫌套,一般保持默認(rèn)0,幫助我們更好的理解模型

    • nthread 用來進行多線程控制圾旨,默認(rèn)為最大可能的線程數(shù)(使用CPU全部的核)

    • eta 和GBDT種的 learning rate 類似踱讨,通過減少每一步的權(quán)重可以提高模型的魯棒性 典型值:0.01~0.02

    • min_chile_weight 默認(rèn)為1 決定最小葉子節(jié)點樣本權(quán)重和,類似 GBDT的min_child_leaf(最小樣本總數(shù))砍的, 這個參數(shù)用于避免過擬合勇蝙,值越大,可以避免模型學(xué)習(xí)到局部的特殊樣本挨约,但如果這個值越高會導(dǎo)致欠擬合,可以使用CV調(diào)優(yōu)

    • max_depth 默認(rèn)6 樹的最大深度 可以使用CV調(diào)優(yōu) 典型值:3~10

    • max_leaf_nodes 樹上最大的節(jié)點或葉子數(shù)量产雹,可以替代max_depth的作用诫惭,因為如果生成二叉樹,一個深度為n的樹最多n2個葉子蔓挖,如果定義這個參數(shù)模型會忽略max_depth

    • gamma 默認(rèn)0夕土,在節(jié)點分裂時,只有分裂后損失函數(shù)的值下降了 才會分裂這個節(jié)點瘟判,gamma制定了節(jié)點分裂所需的最小損失函數(shù)下降值怨绣。這個參數(shù)越大算法越保守,可使用CV調(diào)整拷获,和損失函數(shù)息息相關(guān)篮撑。

    • max_delta_step 默認(rèn)0,限制每棵樹權(quán)重改變的最大步長匆瓜,如果為0意味著沒有約束赢笨,如果被賦予正值會讓算法更加保守, 通常不設(shè)置驮吱。(各類樣本十分不平衡時可以嘗試)

    • subsample 默認(rèn)1茧妒,控制每棵樹隨機采樣的比例,減小這個參數(shù)的值左冬,算法會更加保守桐筏,避免過擬合,(如果設(shè)置過小拇砰,會欠擬合)典型值0.5~1

    • colsample_bytree 默認(rèn)1梅忌,控制每棵隨機采樣的列數(shù)的占比 典型0.5~1

    • colsample_byleve 默認(rèn)1狰腌,控制樹的每一集的每一次分裂,對列數(shù)的采樣的占比铸鹰,一般不調(diào)整

    • lambda 默認(rèn)1癌别,權(quán)重的L2正則化項,(和Ridge類似)蹋笼,可以應(yīng)用在很高維度的情況下使得算法的速度更快

    • scale_pos_weight 默認(rèn)1展姐,在個類別十分不平衡是,把這個參數(shù)設(shè)置為正數(shù)剖毯,可以使得算法更快收斂圾笨。

      ... ...

bagging 套袋

關(guān)注降低方差:度量了同等大小的訓(xùn)練集的變動導(dǎo)致學(xué)習(xí)性能的變化⊙纺保刻畫了數(shù)據(jù)擾動所導(dǎo)致的影響擂达。

通過對訓(xùn)練樣本重新采樣的方法得到不同的訓(xùn)練樣本集,在這些新的訓(xùn)練樣本集上分別訓(xùn)練學(xué)習(xí)器胶滋,最終合并每一個學(xué)習(xí)器的結(jié)果板鬓,作為最終的學(xué)習(xí)結(jié)果。

隨機森林

from sklearn.ensemble import RandomForestClassifier

確定森林中的樹是 CART 二叉樹

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

  2. 特征隨機: 從所有的屬性中隨機選取 k 個屬性究恤, 選擇最佳的分割屬性作為節(jié)點建立決策樹

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

  4. 這 m 棵CART樹形成隨機森林, 通過投票表決結(jié)果部宿, 決定數(shù)據(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è)置最大深度(一般不超過8)
- 棵數(shù)
- 最小分裂樣本數(shù)
- 類別比例

無監(jiān)督學(xué)習(xí)

聚類

K-means * from sklearn.cluster import KMeans

  • 算法步驟

    1. 在整個樣本群中定義 K 個種子點理张、

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

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

    4. 重復(fù) 2 3 兩步雾叭, 直至所有的種子點不需要在移動為止

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)練過程: 根據(jù) K-means++ 選取 8 個種子點悟耘, 計算所有樣本點到每一個種子點的歐氏距離, 取這個樣本點距離最近的那個種子點拷况, 該樣本點就劃歸為這個種子點的簇作煌。將種子點移動到該簇的幾何中心, 再循環(huán)上面的操作赚瘦, 直至種子點不再移動為止粟誓。 最后得到八個有序號的簇(不是標(biāo)簽, 因為多次訓(xùn)練序號可能會發(fā)生改變)

預(yù)測 km.predict(digits_x_train) 得到的是所屬的簇的序號

digits_y_pre = km.predict(digits_x_test) 預(yù)測的簇的序號

?
?</pre>

  • ARI 指標(biāo)起意, 適用于有對應(yīng)的標(biāo)簽數(shù)據(jù)(聚類問題一般沒有標(biāo)簽數(shù)據(jù))鹰服, 代表的是聚類的劃分和標(biāo)簽的劃分的吻合程度

    from sklearn.metrics import adjusted_rand_score

    adjusted_rand_score(digits_y_test, digits_y_pre)

  • 輪廓系數(shù): 用于評測聚類劃分的性能, 兼顧了聚類內(nèi)部的凝聚程度和聚類之間的離散程度

    from sklearn.metrics import silhouette_score 樣本輪廓系數(shù)的平均數(shù)

    輸出聚類的編號 labels = km.labels_

    silhouette_score(digits_x_train, labels)

  • 尋找最優(yōu)聚類個數(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ù)升維

多項式特征生成器

from sklearn.preprocessing import PolynomialFeatures

特征降維

PCA *

from sklearn.decomposition impoprt PCA

在數(shù)據(jù)挖掘的過程中逗柴, 某些屬性之間存在相關(guān)性, 可以抹去或者通過某些算法把他們映射到更低的維度顿肺, 從而提高機器學(xué)習(xí)的效率和準(zhǔn)確率戏溺。

  • 向量的內(nèi)積和投影

    1. 內(nèi)積:兩個維度(特征個數(shù))相同的向量

      (a1, a2, ... ... ,an)^T 和 (b1, b2, b3, ... ... , bn) ^T

      (a1, a2, ... ... ,an) * (b1, b2, b3, ... ... , bn) ^T = a1b1 + a2b2 + ... ... + anbn

    2. 向量內(nèi)積的幾何意義:

      二維空間中有兩個向量 A(x1, y1), B(x2, y2)

      |A|*cosα 為 A 向量 在 B 向量上的投影

      A * B = |A| * |B| * cosα 為內(nèi)積

      此時如果 B 為單位向量 那么 A * B = |A| * cosα 為 A 在 B 上的投影

    3. 向量基

      在一個平面直角坐標(biāo)系中, 表示某個點P(x0, y0) 此時向量P值就是(x0, y0)

      x軸y軸上個存在一個模為1的向量(1, 0) 和 (0, 1) 稱(1, 0) 屠尊, (0, 1) 為二維空間中的一組基

      只要是兩個線性無關(guān)的單位向量都可以作為整個空間的一組基

      一般情況下旷祸, 我們有m個n維向量, 像將其轉(zhuǎn)換成R個由N維向量構(gòu)成的新空間讼昆, 首先將R個基 按照行進行排寫成一個矩陣A 托享, 再將向量按照列組合成一個矩陣B, 然后計算 A * B

      兩個矩陣相稱的物理意義: 實際上就是將右邊的矩陣的每一個列轉(zhuǎn)變到左邊矩陣為基的一個新的空間中

      右邊矩陣的行數(shù)代表降維之前的維度浸赫, 左邊矩陣的行數(shù)代表降維以后的維度闰围。

      問題: 如何選擇最優(yōu)基?

  • Principal Component Analysis 主成分分析

    [[1, 1, 2, 4, 2]既峡, [1, 3, 3, 4, 4]]

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

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

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

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

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

    3. 求協(xié)方差矩陣的特征值及其對應(yīng)的特征向量

      |C - λE| = 0 ====> |[6/5 - λ 4/5], [4/5 6/5 - λ]|

      解得 λ = 2辫诅, 2/5即協(xié)方差矩陣C的特征值

      對應(yīng)的特征向量依次是

      特征向量標(biāo)準(zhǔn)化

      把特征向量組成一個特征矩陣

      驗證矩陣的對角化

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

    5. 降維, 對 Y 向量降維么夫, X = PY 者冤, X 就是 Y 的K維主成分空間

SVD矩陣分解
LDA
獨立成分分析(ICA)

與PCA相關(guān), 但他在發(fā)現(xiàn)潛在因素方面效果良好档痪,它可以應(yīng)用在數(shù)字圖像涉枫、當(dāng)問數(shù)據(jù)庫、經(jīng)濟指標(biāo)腐螟、心理測量等

SMOTE

針對類不均衡的過采樣算法

  • 對于少數(shù)類的每一個樣本x愿汰, 以歐氏距離標(biāo)準(zhǔn)計算他到少數(shù)類樣本集中的所有樣本的距離, 得到其K近鄰

  • 根據(jù)樣本不均衡比設(shè)置一個采樣比例以確定采樣倍率乐纸, 對于每一個少數(shù)類樣本x衬廷, 其K近鄰中隨機選擇若干個樣本, 假設(shè)選擇的近鄰為Xn

  • 對每一個隨機選出的近鄰Xn汽绢, 分別與原樣本按如下公式構(gòu)建新的樣本

    Xnew = X + rand(0, 1) * |x - xn|

from imblearn.over_sampling import SMOTE
    smote = SMOTE()
    target.value_counts()  # 觀察是否存在樣本不均衡問題
    data, target = smote.fit_sample(data, target)
    # 通過以上過采樣算法后 (target==0).sum()  與  (target==1).sum() 數(shù)量一樣多</pre>

缺陷:

  • K值選擇存在盲目性

  • 無法克服非均衡數(shù)據(jù)集的數(shù)據(jù)分布問題吗跋, 易產(chǎn)生分布邊緣化問題, 因為負(fù)類樣本決定了其緊鄰的可選擇位置, 會造成人造樣本越來越邊緣化跌宛, 是的邊界模糊加大算法分類難度酗宋。

預(yù)處理

  • 特征工程: 篩選有用的特征

  • 清洗: 缺失值, 異常值疆拘, 重復(fù)值

  • 數(shù)據(jù)處理

  • 數(shù)據(jù)的歸一化: 將屬性縮放到一個指定的最大值和最小值之間 通常是(0蜕猫, 1)
from sklearn.preprocessing import MinMaxScaler
MinMaxScaler().fit_transform(data)
# (data-min(data)) / max(data) - min(data)</pre>

目的:

  1. 對于方差較小的屬性可以增加其穩(wěn)定性,
  2. 維持稀疏矩陣中0的條目哎迄,
  3. 防止過大的屬性對模型起過份主導(dǎo)作用
  • 數(shù)據(jù)的標(biāo)準(zhǔn)化
    將數(shù)據(jù)按照比例進行縮放回右, 使之落入一個小的特定區(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)為L2正則化</pre>

模型評測指標(biāo)

每個模型都自帶有一個性能檢測方法芬失, score 在性能檢測過程中會把 data 帶入模型中進行訓(xùn)練并得到預(yù)測值楣黍, 然后求預(yù)測值和 target 的吻合程度(準(zhǔn)確度, 從宏觀上表達(dá)了預(yù)測數(shù)據(jù)和真實數(shù)據(jù)的差別)

性能檢測報告

栗子:有兩個類別 A 和 B 預(yù)測結(jié)果有4種 TrueA棱烂,TrueB租漂,F(xiàn)alseA,F(xiàn)alseB

精確率: 表示每一個類別預(yù)測正確的數(shù)量占預(yù)測為該類別的數(shù)量的比例

Preision_A = TrueA/(TrueA+FalseA),Preision_B = TrueB/(TrueB+FalseB)

召回率: 表示每一個類別預(yù)測正確的數(shù)量占真正為該類別的數(shù)量的比例

Recall_A = TrueA/(TrueA+FalseB)

F1指標(biāo): 精確率和召回率的調(diào)和平均數(shù)颊糜, 如果兩個指標(biāo)相近哩治,那么調(diào)和平均數(shù)的值就大

F1_A = 2/(1/Precision_A + 1/Recall_A)

【注意】在評測一個模型的時候如果某個標(biāo)簽精確率和召回率偏差過大,則該模型在預(yù)測該類別的時候的預(yù)測結(jié)果就不具備參考價值

  • 分類問題: 混淆矩陣

    from sklearn.metrics import classification_report

    print(classification_report(y_pre, y_test))

  • 回歸問題: 均方誤差 平均絕對誤差

    from sklearn.metrics import mean_absolute_error,mean_squared_error

    mean_absolute_error(y_,b_y_test)

    mean_squared_error(y_,b_y_test)

交叉驗證

from sklearn.model_selection import cross_val_score
# 實例化算法模型
knn = KNeighborsClassifier()
dt = DecisionTreeClassifier()
# 輸出劃分對應(yīng)類別時的準(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
# 決策樹模型 通過調(diào)節(jié) max_depth 最大深度
# 支持向量機 
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ù)越大衬鱼,懲罰程度越大业筏, 容錯率越小)
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)容合作請聯(lián)系作者
  • 序言:七十年代末樊拓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子塘慕,更是在濱河造成了極大的恐慌筋夏,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件图呢,死亡現(xiàn)場離奇詭異叁丧,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門拥娄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚊锹,“玉大人,你說我怎么就攤上這事稚瘾∧道ィ” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵摊欠,是天一觀的道長丢烘。 經(jīng)常有香客問我,道長些椒,這世上最難降的妖魔是什么播瞳? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮免糕,結(jié)果婚禮上赢乓,老公的妹妹穿的比我還像新娘。我一直安慰自己石窑,他們只是感情好牌芋,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著松逊,像睡著了一般躺屁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上经宏,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天犀暑,我揣著相機與錄音,去河邊找鬼烁兰。 笑死母怜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缚柏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碟贾,長吁一口氣:“原來是場噩夢啊……” “哼币喧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袱耽,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤杀餐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后朱巨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體史翘,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼讽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片必峰。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钻蹬,靈堂內(nèi)的尸體忽然破棺而出吼蚁,到底是詐尸還是另有隱情,我是刑警寧澤问欠,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布肝匆,位于F島的核電站,受9級特大地震影響顺献,放射性物質(zhì)發(fā)生泄漏旗国。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一注整、第九天 我趴在偏房一處隱蔽的房頂上張望能曾。 院中可真熱鬧,春花似錦设捐、人聲如沸借浊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚂斤。三九已至,卻和暖如春槐沼,著一層夾襖步出監(jiān)牢的瞬間曙蒸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工岗钩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纽窟,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓兼吓,卻偏偏與公主長得像臂港,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子视搏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容