sklearn之——簡單上手

…代碼源自老師,記在CSDN上分析一下,目的就是理清sklearn的上手方法。方便大家查看,忘了的時候回來看一下。

源代碼
明確一下我們的目的:瞭解機器學習在數據科學中的典型應用。
實現方法:選擇支持向量機,決策樹,樸素貝葉斯算法。
利用:python中的sklearn

首先先給我們將要實現的三個分類算法起三個名字:

names = ["Linear SVM", "Decision Tree", "Naive Bayes"]
# 其實我一直想叫它天真貝葉斯。。。

然後就要設置我們想要設置的分類器了。在這裏我們要import三個庫:

from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
classifiers = [
    SVC(kernal="Linear", C=0.025),
    DecisionTreeClassifier(max_depth=5),
    GaussianNB()]

C: 懲罰係數,用來控制損失函數的懲罰係數,類似於LR中的正則化係數。
C越大,相當於懲罰鬆弛變量,希望鬆弛變量接近0,
即對誤分類的懲罰增大,趨向於對訓練集全分對的情況,準確率很高,但泛化能力弱,容易導致過擬合。
C值小,對誤分類的懲罰減小,容錯能力增強,泛化能力較強,但也可能欠擬合

kernel: 算法中採用的核函數類型,核函數是用來將非線性問題轉化爲線性問題的一種方法。
參數選擇有RBF, Linear, Poly, Sigmoid,precomputed或者自定義一個核函數, 默認的是"RBF",即徑向基核,也就是高斯核函數;
而Linear指的是線性核函數,Poly指的是多項式核,Sigmoid指的是雙曲正切函數tanh核;
因爲這裏用到的是線性支持向量機,所以設置爲linear

max_depth: 決策樹最大深度。
數據類型int or None, optional (default=None)
一般來說,數據少或者特徵少的時候可以不管這個值。
如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分佈。
常用的可以取值10-100之間。常用來解決過擬合

在scikit-learn中,一共有3個樸素貝葉斯的分類算法類。
分別是GaussianNB,MultinomialNB和BernoulliNB。
其中GaussianNB就是先驗爲高斯分佈的樸素貝葉斯,
MultinomialNB就是先驗爲多項式分佈的樸素貝葉斯,
而BernoulliNB就是先驗爲伯努利分佈的樸素貝葉斯。

這三個類適用的分類場景各不相同,一般來說,如果樣本特徵的分佈大部分是連續值,使用GaussianNB會比較好。
如果如果樣本特徵的分大部分是多元離散值,使用MultinomialNB比較合適。
而如果樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。

接下來我們需要生成一個用於分類的數據集 這裏設置爲線性可分的數據集,輸入變量設置爲兩個特徵:X, y。(之前看莫煩的教程上也是用X,y而不是用X,Y或者x, y表示不知道爲什麼,希望有人知道可以告訴我🙇‍)。這時我們也需要導入一個製作數據集庫datasets

from sklearn.datasets import make_classification
X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,
                           random_state=1, n_clusters_per_class=1)
                           '''
n_features :特徵個數= n_informative() + n_redundant + n_repeated
n_informative:多信息特徵的個數
n_redundant:冗餘信息,informative特徵的隨機線性組合
n_repeated :重複信息,隨機提取n_informative和n_redundant 特徵
n_classes:分類類別
n_clusters_per_class :某一個類別是由幾個cluster構成的
'''

如果我們對這個datasets庫不是很明白的話,我們可以進入https://scikit-learn.org/stable/modules/classes.html中查看。這其中有許多我們在各種教程中看到的比如,糖尿病數據集的使用:
在這裏插入圖片描述

# 我們就可以這麼操作 
from sklearn import datasets
datasets = datasets.load_diabetes()

接着我們回過來進行測試:我們先設置一個僞隨機數種子,然後再利用這個種子來對X進行擾動。

rng = np.random.RandomState(2) 
X += 2 * rng.uniform(size=X.shape)

然後再將上述得到的X,y構建成一個線性可分的數據集。

linearly_seprable = (X, y)

接着我們選擇三個數據集,分別是make_moons, make_cycles, 以及前面的linearly_seprable。此時需要從datasets中導入兩個人數據集:

from sklearn.datasets import make_moons, make_cycles
datasets = [make_moons(noises=0.1, random_state=0)

如果我們不清楚make_moons的參數,只需要點進去就可以看到它的全部參數,還可以去github上去看它的源代碼,那裏有着sklearn的許多開發者。在這裏插入圖片描述

如果此時我們想查看一下我們的數據集現在的內容的話,只要簡單的print一下就可以:

print("make_moons:", make_moons(noise=0.1, random_state=0))
print("make_circles:", make_circles(noise=0.1, factor=0.5, random_state=1))
print("linearly_separable:", linearly_separable)
print("datasets:",  datasets)

接下來我們就要以圖的i形式來展現我們的三種分類分類後的結果:
首先設置顯示結果圖的大小, 此時我們需要再導入一個繪圖庫matplotlib

import matplotlib.pyplot as plt
figure = plt.figure(figuresize=(27, 19))
i = 1

然後分別對每個數據集做訓練及測試:
在這裏我們要對數據進行標準化處理,因此需要導入train_test_split, 以及matlab的一些繪圖庫ListedColormap。這裏我們訓練的思想就是利用train_test_split函數來將數據集分割成訓練集和測試集兩個部分。這裏我們選取60%的數據集用來訓練,40%用來測試。

from sklearn.model_selection import train_test_split
from matplotlib.colors import ListedColormap
for ds_cnt, ds in enumerate(datasets):
    # print("ds_cnt:", ds_cnt)
    # 處理數據集,每一個ds相當於每一個數據集,共三個數據集
    X, y = ds
    # print("ds:", ds)
    X = StandardScaler().fit_transform(X)  # 標準化數據
    # print("X:", X) #每一個X是100*2的二維數組
    # print("y:", y) #每一個y是100*1的二維數組
    X_train, X_test, y_train, y_test = \
        train_test_split(X, y, test_size=0.4, random_state=42)  # 分割數據集

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5  # 取X特徵的第一個特徵取值範圍作爲橫軸
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5  # 取X特徵的第二個特徵取值範圍作爲縱軸

    h = .02  # 設置網格的步長
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),  # 按步長在橫縱軸上設置網格
                         np.arange(y_min, y_max, h))
    # print("網格橫軸:", xx)
    # print("網格縱軸:", yy)

    # 先展示輸入數據集
    cm = ListedColormap((['red', 'blue']))  # 設置分割面的顏色
    cm_bright = ListedColormap(['#FF0000', '#0000FF'])  # 設置散點的顏色
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)  # 劃分子圖
    # len(datasets)爲數據集的個數,子圖的行數,3個數據集,3行子圖
    # len(calssifiers)爲算法個數,共3種算法,原來生成的數據集,共4列
    # for ds_cnt, ds in enumerate(datasets):
    # ds_cnt取值爲0,1,2,對每一個數據集畫散點圖
    if ds_cnt == 0:
        ax.set_title("Input data")
    # 畫訓練集散點,訓練集用0標識,測試集用×標識,橫軸爲一維數據,縱軸爲二維數據
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
               edgecolors='k', marker='o', label='train set')
    # 畫測試集散點
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6,
               edgecolors='k', marker='x', label='test set')
    # 畫座標軸
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1
    # 處理下一個訓練集

    # 分別對每個分類器做訓練測試
    # 設置顯示結果的圖的標題
    # names = ["Linear SVM", "Decision Tree", "Naive Bayes"]
    # clsssifiers=[ SVC(kernel="linear", C=0.025),
    #     DecisionTreeClassifier(max_depth=5),
    #     GaussianNB()]
    for name, clf in zip(names, classifiers):
        # zip函數令算法名稱和算法形成一一對應關係(“Linear SVM”,SVC)
        # (“"Decision Tree”,DecisionTreeClassifier,)
        # (""Naive Bayes", GaussianNB())
        # print("name:", name)
        # print("classifiers:", classifiers)
        # 每一種數據對應一行,每一種分類算法對應一列
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
        clf.fit(X_train, y_train)  # 訓練集訓練分類器
        score = clf.score(X_test, y_test)  # 測試集測試分類器

        # 畫分類面和數據集點分佈
        # 爲了畫出分類邊界,我們用訓練好的分類器對之前設置的網格每個點做分類
        if hasattr(clf, "decision_function"):
            # print("clf:", clf)
            # print("hasattr:", hasattr(clf, "decision_function"))
            # 打印結果全爲True
            Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])  # ravel()函數用於展平數組
            # print("Z:", Z)

        else:
            Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

        # 將分類結果利用contourf(等高線)函數畫出
        Z = Z.reshape(xx.shape)
        ax.contourf(xx, yy, Z, cmap=cm, alpha=.4)

        # 畫訓練集點
        ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright,
                   edgecolors='k', marker='o', label='train set')
        # 畫測試集點
        ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
                   edgecolors='k', marker='x', label='test set')

        # 畫座標軸
        ax.set_xlim(xx.min(), xx.max())
        ax.set_ylim(yy.min(), yy.max())
        ax.set_xticks(())
        ax.set_yticks(())
        if ds_cnt == 0:
            # 畫子圖標題
            # ds_cnt的取值爲0,1,2意爲每一個數據集的第1,2,3種算法,只有當每一個數據集的第一種算法時纔會畫子圖標題
            ax.set_title(name)
            # names = ["Linear SVM", "Decision Tree", "Naive Bayes"]
        # 顯示測試準確率
        #  score = clf.score(X_test, y_test)  # 測試集測試分類器
        ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
                size=20, horizontalalignment='right')
        i += 1
        # 子圖的計數方法爲:圖像從左到右,從上到下排列

最後畫圖顯示,結束!

plt.tight_layout()
# tight_layout()自動調整subplot間的參數
plt.savefig("classifier comparison.png")
plt.show()

結果如下:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章