AI學習---分類算法[K-近鄰 + 樸素貝葉斯 + 決策樹 + 隨機森林 ]

分類算法:對目標值進行分類的算法
    一、sklearn轉換器(特徵工程)和預估器(機器學習)
    二、KNN算法(根據鄰居肯定類別 + 歐氏距離 + k的肯定),時間複雜度高,適合小數據
    三、模型選擇與調優
    四、樸素貝葉斯算法(假定特徵互獨立 + 貝葉斯公式(機率計算) + 拉普拉斯平滑係數),假定獨立,對缺失數據不敏感,用於文本分類
    五、決策樹(找到最高效的決策順序--信息增益(關鍵特徵=信息熵-條件熵) + 能夠可視化)
    六、隨機森林(bootstarp(又放回的抽取) + 特徵隨機(抽取小特徵) + 多個決策樹)html

 

image

                image 

sklearn轉換器(transfer)與估計器(estimeter)簡介

一、轉換器 - 特徵工程的父類java

轉換器 - 特徵工程的父類
    一、API的實現過程:
        1 實例化 (實例化的是一個轉換器類(Transformer))
        2 調用fit_transform(對於文檔創建分類詞頻矩陣,不能同時調用)
    二、sklearn的標準化:
        計算公式:(x - mean) / std
           x: 數據
           mean: 該列的平均值
           std: 標準差
        咱們調用fit_transform()實際上發生了2個步驟:
            fit()               計算 每一列的平均值、標準差
            transform()     (x - mean) / std進行最終的轉換ios

# 轉換器的實例講解
import sklearn
# 特徵預處理
from sklearn.preprocessing import StandardScaler


def stand_demo():
    data = [[1, 2, 3], [4, 5, 6]]
    # 一、實例化一個類
    std = StandardScaler()
    # 二、調用fit_transform()
    new_data = std.fit_transform(data)

    ''' 
    
        fit = std.fit(data):  # 已經完成了列的平均值和標準差的計算
            StandardScaler(copy=True, with_mean=True, with_std=True)
            
        std = std.transform(data): # 根據公式(x - mean) / std進行最終的轉換
            [[-1. -1. -1.]
            [ 1.  1.  1.]]
            
        new_data = std.fit_transform(data): 
            [[-1. -1. -1.]
            [ 1.  1.  1.]]
    '''
    print(new_data)


if __name__ == '__main__':
    stand_demo()

 

二、估計器--sklearn機器學習算法的實現算法

基於估計器的算法APIjson

image

估計器的工做流程:bootstrap

估計器(estimator)
        1 實例化一個estimator
        2 estimator.fit(x_train, y_train)   --> 用於計算dom

                 x_train: 訓練集的特徵值, y_train: 訓練集的目標值
                 —— 調用完畢,模型生成
        3 模型評估(有2種方法實現):
            1)直接比對真實值和預測值
                    y_predict = estimator.predict(x_test)   # x_test: 測試集的特徵值, y_predict: 測試集的預測值機器學習

                    y_test == y_predict                           # 對比測試集的預測值(y_predict)與測試集的目標值(y_test)是否一致
            2)計算準確率
                    accuracy = estimator.score(x_test, y_test)  # 傳遞測試集特徵值和測試集目標值進行準確率計算學習

image

KNN算法(K-近鄰算法)

image

KNN的核心算法: 經過計算A到鄰居(B、C、D、E、F)的距離能夠判斷A屬於哪一個類別(區域)。K就是類似特徵測試

距離計算公式:

     0、歐式距離

     一、曼哈頓距離 (絕對值距離)

     二、明可夫斯基距離(基於0和1實現)

image

K-近鄰算法對目標數據的處理:

       無量綱化的處理,即【標準化】(歸一化會受到異常數據影響)

image

若是取的最近的電影數量不同?會是什麼結果?
      k 值取得太小(即1個樣本點),容易受到異常點的影響
      k 值取得過大(即取出多樣本),樣本不均衡的影響

K-近鄰算法API

image

KNN算法案例1:鳶尾花種類預測

image

案例分析:

   1. 獲取數據(sklearn自帶的數據便可)

   2. 數據處理(可省略,數據已經處理的很好了,目的是取出不完整的數據)

   3. 特徵工程

         1. 數據集的劃分(訓練數據 + 測試數據)

         2. 特徵抽取(可省略,4個特徵)

         3. 特徵預處理(標準化)  --》 訓練數據和測試數據都須要

         4. 降維(可省略,降維的目的是減小特徵,這裏就4個特徵)

   4. KNN預估計流程

   5. 模型評估

基於KNN實現鳶尾花的分類完整Demo:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

def knn_demo():
    '''
      基於KNN實現鳶尾花的分類
    :return:
    '''

    # 一、獲取數據
    iris = load_iris()
    print('iris', iris.data.shape)
    # 二、數據劃分
    # 結果跟隨機數種子random_state有關
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=6)
    # 三、特徵工程: 標準化
    stand_transfer = StandardScaler()
    '''
       原則: 訓練集的數據作的操做,測試集也是須要作一樣的操做
       實現: 
            訓練集:
                stand_transfer對訓練集進行了fit()和transfer(),即fit用於計算平均值和標準差,tranfer用於公式計算
            測試集:
                stand_transfer對訓練集進行了transfer(),即用訓練集求出來的平均值和標準差進行最後的公式計算(標準化)
                若是對測試集用了fit_tranform(),即對測試集測試的僅僅是本身的數據內容,與訓練內容無關
    '''
    x_train = stand_transfer.fit_transform(x_train)  # 要對訓練標準化
    print('x_train', x_train.shape)
    x_test = stand_transfer.transform(x_test)  # 用訓練集的平均值和標準差對測試集進行標準化
    print('x_test', x_test.shape)

    # 四、KNN算法評估器
    knn_estimater = KNeighborsClassifier(n_neighbors=3) # 鄰居數量,默認是5
    knn_estimater.fit(x_train, y_train)   # 訓練完成,產生模型;x_train: 訓練集的特徵值, y_train: 訓練集的目標值

    # 五、模型評估
    # 方法1;直接對比真實值和預測值
    y_predict = knn_estimater.predict(x_test)
    print('y_predict', y_predict)
    print('真實值和預測值:', y_predict == y_test)

    # 方法2:計算準確率
    score = knn_estimater.score(x_test, y_test) # 傳遞測試集特徵值和測試集目標值進行準確率計算
    print('準確率:',score)
    return  None


if __name__ == '__main__':
    knn_demo()

image

KNN算法總結

image 

附: 咱們能夠利用【模型與調優】進行K的肯定

模型選擇與調優

image

模型選擇與調優的方案

   一、交叉驗證(Cross Validate)

   二、超參數搜索 –> 網格搜索(Grid Search)

 

方案一:交叉驗證(cross validate, 即有限數據屢次驗證,被評估的模型更加可信)

image

方案二:超參數搜索--網格搜索(Grid Search)

image

模型選擇與調優API

    說明:GridSearchCV實際上也是一個評估器,用法與上面相同

image

基於KNN實現鳶尾花的分類,添加網格搜索和交叉驗證,用於肯定最優的K值完整Demo:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier


def knn_gridSearch_demo():
    '''
      基於KNN實現鳶尾花的分類,添加網格搜索和交叉驗證,用於肯定最優的K值
    :return:
    '''

    # 一、獲取數據
    iris = load_iris()
    print('iris', iris.data.shape)
    # 二、數據劃分
    # 結果跟隨機數種子random_state有關
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=3)
    # 三、特徵工程: 標準化
    stand_transfer = StandardScaler()
    '''
       原則: 訓練集的數據作的操做,測試集也是須要作一樣的操做
       實現: 
            訓練集:
                stand_transfer對訓練集進行了fit()和transfer(),即fit用於計算平均值和標準差,tranfer用於公式計算
            測試集:
                stand_transfer對訓練集進行了transfer(),即用訓練集求出來的平均值和標準差進行最後的公式計算(標準化)
                若是對測試集用了fit_tranform(),即對測試集測試的僅僅是本身的數據內容,與訓練內容無關
    '''
    x_train = stand_transfer.fit_transform(x_train)  # 要對訓練標準化
    print('x_train', x_train.shape)
    x_test = stand_transfer.transform(x_test)  # 用訓練集的平均值和標準差對測試集進行標準化
    print('x_test', x_test.shape)

    # 四、KNN算法評估器
    knn_estimater = KNeighborsClassifier()

    # 五、加入網格搜索與交叉驗證
    param_dict = {"n_neighbors": [1, 3, 5, 7, 9, 11]}  # 這裏只能是字典
    '''
        estimator : estimator object.
        param_grid : dict or list of dictionaries
    '''
    knn_estimater = GridSearchCV(estimator=knn_estimater, param_grid=param_dict, cv=10)
    knn_estimater.fit(x_train, y_train)  # 訓練完成,產生模型;x_train: 訓練集的特徵值, y_train: 訓練集的目標值

    # 六、模型評估
    # 方法1;直接對比真實值和預測值
    y_predict = knn_estimater.predict(x_test)
    print('y_predict', y_predict)
    print('真實值和預測值:', y_predict == y_test)

    # 方法2:計算準確率
    score = knn_estimater.score(x_test, y_test)  # 傳遞測試集特徵值和測試集目標值進行準確率計算
    print('準確率:', score)

    # 最佳參數:best_params
    print("最佳參數:\n", knn_estimater.best_params_)
    # 最佳結果:best_score_
    print("最佳結果:\n", knn_estimater.best_score_)
    # 最佳估計器:best_estimator_
    print("最佳估計器:\n", knn_estimater.best_estimator_)
    # 交叉驗證結果:cv_results_
    print("交叉驗證結果:\n", knn_estimater.cv_results_)

    return None


if __name__ == '__main__':
    knn_gridSearch_demo()

image

拓展:

image

 

Facebook的預測簽到位置案例:

image

image

Facebook的預測籤Demo

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier


def facebook_demo():
    # 一、獲取數據
    data = pd.read_csv("F:\instacart\\train.csv")

    # 二、基本的數據處理
    # 1)縮小數據範圍
    data = data.query("x < 3 & x > 2 & y < 3 & y > 2")
    # 2)處理時間特徵
    time_value = pd.to_datetime(data["time"], unit="s")
    date = pd.DatetimeIndex(time_value)
    data["day"] = date.day
    data["weekday"] = date.weekday
    data["hour"] = date.hour

    # 3)過濾簽到次數少的地點
    place_count = data.groupby("place_id").count()["row_id"]  # 僅僅顯示place_id的簽到次數和row_id信息
    # data_final --> pandas.core.frame.DataFrame類型
    data_final = data[data["place_id"].isin(place_count[place_count > 3].index.values)]  # 過濾出來次數大於3的數據

    # 4)篩選特徵值和目標值
    x = data_final[["x", "y", "accuracy", "day", "weekday", "hour"]]
    y = data_final["place_id"]

    # 5)數據集劃分
    x_train, x_test, y_train, y_test = train_test_split(x, y)  # 傳入特徵值和目標值

    # 三、特徵工程:標準化
    stand_transfer = StandardScaler()
    x_train = stand_transfer.fit_transform(x_train)  # 要對訓練標準化
    print('x_train', x_train.shape)
    x_test = stand_transfer.transform(x_test)  # 用訓練集的平均值和標準差對測試集進行標準化
    print('x_test', x_test.shape)

    # 四、KNN算法評估器
    knn_estimater = KNeighborsClassifier()

    # 五、加入網格搜索與交叉驗證
    param_dict = {"n_neighbors": [1, 3, 5]}  # 這裏只能是字典
    '''
        estimator : estimator object.
        param_grid : dict or list of dictionaries
    '''
    knn_estimater = GridSearchCV(estimator=knn_estimater, param_grid=param_dict, cv=5)
    knn_estimater.fit(x_train, y_train)  # 訓練完成,產生模型;x_train: 訓練集的特徵值, y_train: 訓練集的目標值

    # 六、模型評估
    # 方法1;直接對比真實值和預測值
    y_predict = knn_estimater.predict(x_test)
    print('y_predict', y_predict)
    print('真實值和預測值:', y_predict == y_test)

    # 方法2:計算準確率
    score = knn_estimater.score(x_test, y_test)  # 傳遞測試集特徵值和測試集目標值進行準確率計算
    print('準確率:', score)

    # 最佳參數:best_params
    print("最佳參數:\n", knn_estimater.best_params_)
    # 最佳結果:best_score_
    print("最佳結果:\n", knn_estimater.best_score_)
    # 最佳估計器:best_estimator_
    print("最佳估計器:\n", knn_estimater.best_estimator_)
    # 交叉驗證結果:cv_results_
    print("交叉驗證結果:\n", knn_estimater.cv_results_)

    return None


if __name__ == '__main__':
    facebook_demo()

image 

 

樸素貝葉斯算法

機率(Probability):

    聯合機率、條件機率與相互獨立
    聯合機率:包含多個條件,且全部條件同時成立的機率
    條件機率:就是事件A在另一個事件B已經發生條件下的發生機率
    相互獨立:  P(A, B) = P(A)P(B) <=> 事件A與事件B相互獨立
樸素
   假設:特徵與特徵之間是相互獨立

樸素貝葉斯算法:     樸素 + 貝葉斯
應用場景:
    文本分類
    單詞做爲特徵

機率

image_thumb[1]

樸素貝葉斯

image_thumb[2]

拉普拉斯平滑係數

image_thumb[3]

image_thumb[4]

樸素貝葉斯API(naive表示樸素的意思)

image_thumb[5]

image

20類新聞分類DEMO

image_thumb[8]

案例分析:20類新聞分類(sklean會從官網下載數據,約14M)
        1)獲取數據
        2)劃分數據集
        3)特徵工程  -->文本特徵抽取(TF-IDF)
        4)樸素貝葉斯預估器流程
        5)模型評估

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

def nb_news():
"""
用樸素貝葉斯算法對新聞進行分類
:return:
"""
# 1)獲取數據
news = fetch_20newsgroups(subset="all")

# 2)劃分數據集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)

# 3)特徵工程:文本特徵抽取-tfidf
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4)樸素貝葉斯算法預估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)

# 5)模型評估
# 方法1:直接比對真實值和預測值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比對真實值和預測值:\n", y_test == y_predict)

# 方法2:計算準確率
score = estimator.score(x_test, y_test)
print("準確率爲:\n", score)

return None

if __name__ == '__main__':
nb_news()
 
image

決策樹

image

   簡單講,決策樹就是咱們Py語言中的if-elif-else語句,經過對特徵的前後順序進行選擇,從而達到高效的決策image

決策樹的原理

信息論基礎
        1)信息(香農定義) :消除隨機不定性的東西
                小明 年齡 「我今年18歲」 - 信息
                小華 」小明明年19歲」 - 不是信息
        2)信息的衡量 –》 信息量 -》 信息熵
            信息的單位:比特(bit)
            g(D,A) = H(D) - 條件熵H(D|A)
        4 決策樹的劃分依據之一------信息增益

image

image

image

image

決策樹的API

image

image

image

案例一: 鳶尾花決策樹demo –> 結果代表KNN算法更好

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz

def decision_iris():
    """
        用決策樹對鳶尾花進行分類
        :return:
        """
    # 1)獲取數據集
    iris = load_iris()

    # 2)劃分數據集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

    # 3)決策樹預估器
    estimator = DecisionTreeClassifier(criterion="entropy")
    estimator.fit(x_train, y_train)

    # 4)模型評估
    # 方法1:直接比對真實值和預測值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比對真實值和預測值:\n", y_test == y_predict)

    # 方法2:計算準確率
    score = estimator.score(x_test, y_test)
    print("準確率爲:\n", score)

    # 可視化決策樹
    export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)

    return None


if __name__ == '__main__':
    decision_iris()

image

可視化:

image

案例二:泰坦尼克號乘客生存預測

image

流程分析:獲取特徵值&目標值
    1)獲取數據
    2)數據處理
        缺失值處理
        特徵值 -> 字典類型
    3)準備好特徵值 目標值
    4)劃分數據集
    5)特徵工程:字典特徵抽取
    6)決策樹預估器流程
    7)模型評估

import pandas as pd

def titanic_demo():
    # 一、獲取數據
    path = "http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
    # titanic = pd.read_csv("F:\instacart\\titanic_demo.txt")  # 小數據,僅部分
    titanic = pd.read_csv(path)  # 大數據
    # 篩選特徵值和目標值
    x = titanic[["pclass", "age", "sex"]]
    y = titanic["survived"]

    # 二、數據處理
    # 1)缺失值處理
    x["age"].fillna(x["age"].mean(), inplace=True)  # 填補平均值,inplace表示填補數據到原數據
    # 2) 轉換成字典
    x = x.to_dict(orient="records")  # x表明dataform, orient=」record」表明json格式
    from sklearn.model_selection import train_test_split
    # 三、數據集劃分
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
    # 四、字典特徵抽取
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.tree import DecisionTreeClassifier, export_graphviz
    transfer = DictVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 3)決策樹預估器
    estimator = DecisionTreeClassifier(criterion="entropy", max_depth=8)
    estimator.fit(x_train, y_train)

    # 4)模型評估
    # 方法1:直接比對真實值和預測值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比對真實值和預測值:\n", y_test == y_predict)

    # 方法2:計算準確率
    score = estimator.score(x_test, y_test)
    print("準確率爲:\n", score)

    # 可視化決策樹
    export_graphviz(estimator, out_file="titanic_tree.dot", feature_names=transfer.get_feature_names())

if __name__ == '__main__':
    titanic_demo()


image

隨機森林

image

image

隨機森林原理過程
    訓練集: N個樣本,包含特徵值+目標值
    特徵值: M個特徵
    隨機 = 兩個隨機(訓練隨機 + 特徵隨機)
        一、訓練集隨機  --》 從N個樣本中隨機有放回的抽樣N個
            bootstrap(隨機有放回抽樣)
         假設有原始數據集合:[1, 2, 3, 4, 5],第一次抽取到了2,而後放回原數據集,抽到下一個數字仍是2,放回後下個是3,以此類推,產生新的樹的訓練集[2, 2, 3, 1, 5]
      

        二、特徵隨機 - 從M個特徵中隨機抽取m個特徵
            M >> m(M遠遠大於m),至關於咱們以前的【降維】,特徵數量減小了,

隨機森林的API

image

image

隨機森林-泰坦尼克號demo

import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

def random_tree_titanic_demo():
    # 一、獲取數據
    path = "http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
    titanic = pd.read_csv("F:\instacart\\titanic_demo.txt")  # 小數據,僅部分
    # titanic = pd.read_csv(path)  # 大數據
    # 篩選特徵值和目標值
    x = titanic[["pclass", "age", "sex"]]
    y = titanic["survived"]

    # 二、數據處理
    # 1)缺失值處理
    x["age"].fillna(x["age"].mean(), inplace=True)
    # 2) 轉換成字典
    x = x.to_dict(orient="records")
    from sklearn.model_selection import train_test_split
    # 三、數據集劃分
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)
    # 四、字典特徵抽取

    transfer = DictVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 3)決策樹預估器
    estimator = RandomForestClassifier()
    # 加入網格搜索與交叉驗證
    # 參數準備
    param_dict = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
    estimator.fit(x_train, y_train)

    # 5)模型評估
    # 方法1:直接比對真實值和預測值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比對真實值和預測值:\n", y_test == y_predict)

    # 方法2:計算準確率
    score = estimator.score(x_test, y_test)
    print("準確率爲:\n", score)

    # 最佳參數:best_params_
    print("最佳參數:\n", estimator.best_params_)
    # 最佳結果:best_score_
    print("最佳結果:\n", estimator.best_score_)
    # 最佳估計器:best_estimator_
    print("最佳估計器:\n", estimator.best_estimator_)
    # 交叉驗證結果:cv_results_
    print("交叉驗證結果:\n", estimator.cv_results_)


if __name__ == '__main__':
    random_tree_titanic_demo()

image

 

其餘

資料連接:https://pan.baidu.com/s/1apbuwSIfSx7OqcFS9KqVBg 提取碼:lvaq

相關文章
相關標籤/搜索