1. 程式人生 > 其它 >十二、機器學習演算法整合(knn、樸素貝葉斯、決策樹、隨機森林、線性迴歸、嶺迴歸、邏輯迴歸、聚類、支援向量機)

十二、機器學習演算法整合(knn、樸素貝葉斯、決策樹、隨機森林、線性迴歸、嶺迴歸、邏輯迴歸、聚類、支援向量機)

技術標籤:機器學習決策樹聚類機器學習

一、需要匯入的庫:

'''
作者:小宇
最後完成日期:2021.2.28
包含內容:knn、樸素貝葉斯、決策樹、隨機森林、線性迴歸、嶺迴歸、邏輯迴歸、聚類、支援向量機
'''
from sklearn.datasets import load_breast_cancer,load_iris,load_boston,load_digits  #匯入資料
from sklearn.naive_bayes import GaussianNB,MultinomialNB    #樸素貝葉斯
from sklearn.model_selection import
train_test_split #資料集劃分 from sklearn.neighbors import KNeighborsClassifier #Knn from sklearn.tree import DecisionTreeClassifier,export_graphviz #決策樹 from sklearn.ensemble import RandomForestClassifier #隨機森林 from sklearn.linear_model import LinearRegression #正則方程優化的線性迴歸
from sklearn.linear_model import Ridge #嶺迴歸 from sklearn.linear_model import SGDRegressor from sklearn.linear_model import LogisticRegression from sklearn.cluster import KMeans from sklearn.svm import SVC from sklearn.feature_extraction import DictVectorizer #特徵抽取 from sklearn.
model_selection import GridSearchCV #網頁搜尋 from sklearn.metrics import accuracy_score #準確率 from sklearn.metrics import classification_report from sklearn.metrics import mean_squared_error from sklearn.metrics import confusion_matrix from sklearn.preprocessing import StandardScaler import pandas as pd import matplotlib.pyplot as plt import numpy as np import random

二、k近鄰:

def knn_algorithm():
    '''
    knn:根據鄰居進行分類,常用歐式距離,還有曼哈頓等距離計算公式
    優點:簡單,易於理解和實現,無需訓練
    缺點:懶惰演算法,計算量大,記憶體開銷大,必須指定K值,
         k值取小:受異常點影響
         k值取大:受樣本均衡影響
    使用場景:小資料場景,幾千~幾萬樣本
    API:sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
         n_neighbors:int,可選(預設= 5),k_neighbors查詢預設使用的鄰居數
         algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可選用於計算最近鄰居的演算法:
    '''
    iris = load_iris()
    x = iris.data
    y = iris.target
    x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=30,train_size =0.8)
    knn = KNeighborsClassifier(n_neighbors=2,algorithm='auto')
    knn.fit(x_train,y_train)
    predictions = knn.predict(x_test)
    print(predictions)
    print(accuracy_score(y_test,predictions))
    return None

三、樸素貝葉斯:

1、貝葉斯公式:
在這裡插入圖片描述
2、拉普拉斯平滑係數(防止計算出的概率為0的情況):
在這裡插入圖片描述

def pbaye_algorithm():
    '''
    樸素貝葉斯:假定事件之間相互獨立,使用貝葉斯公式對樣本進行計算,常用拉普拉斯平滑係數消除由於資料集有限導致概率為0的情況;
    優點:1)有有穩定的分類效率;2)對缺失資料不太敏感,演算法簡單;3)分類準確度高,速度快
    缺點:特徵屬性有關聯時其效果不好
    應用:常用語文字分類等
    API:sklearn.naive_bayes.MultinomialNB(alpha = 1.0)
         alpha:拉普拉斯平滑係數
    '''
    datal = load_breast_cancer()
    x_train,x_test,y_train,y_test = train_test_split(datal['data'],datal['target'],random_state = 20,train_size = 0.8)
    pbaye = MultinomialNB()
    pbaye.fit(x_train,y_train)
    pred = pbaye.predict(x_test)
    print(accuracy_score(y_test,pred))
    print(confusion_matrix(y_test,pred))
    print(classification_report(y_test,pred))
    return None

四、決策樹

1、資訊熵:
底數根據實際情況來取,此處取2

2、資訊增益:
在這裡插入圖片描述
3、資訊熵的計算:
在這裡插入圖片描述
4、條件熵的計算:
在這裡插入圖片描述

def decisionc():
    '''
    決策樹:1)資訊熵:衡量不確定性的大小;2)條件熵H(D|A),條件A下的資訊熵;3)資訊增益:不確定性減少的程度
    優點:簡單,樹木視覺化;
    缺點:數過於複雜時,過擬合。
    改進:1)減枝cart演算法;
         2)隨機森林
    應用:個人信用評估等
    API:class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
        決策樹分類器
        criterion:預設’gini’係數,可選擇資訊增益的熵’entropy’
        max_depth:樹的深度大小
        random_state:隨機數種子
        max_depth:樹的深度大小
    '''
    iris = datasets.load_iris()
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=20,train_size=0.8)
    cls = DecisionTreeClassifier(criterion='entropy')
    cls.fit(x_train,y_train)
    pred = cls.predict(x_test)
    print(accuracy_score(y_test,pred))
    print(confusion_matrix(y_test,pred))
    print(classification_report(y_test,pred))
    #產生決策樹,將得到的文字複製至:http://webgraphviz.com/可得到樹
    data_l = export_graphviz(cls,out_file='tree.dot',feature_names=iris.feature_names)
    return None

五、隨機森林:

def random_forest():
    '''
    隨機森林:隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。
    優點:1)具有極好的準確率;2)能夠有效地執行在大資料集上;3)處理具有高維特徵的輸入樣本,無需要降維就能夠評估各個特徵在分類問題上的重要性。
    API:class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
        隨機森林分類器
        n_estimators:integer,optional(default = 10)森林裡的樹木數量120,200,300,500,800,1200
        criteria:string,可選(default =“gini”)分割特徵的測量方法
        max_depth:integer或None,可選(預設=無)樹的最大深度 5,8,15,25,30
        max_features="auto”,每個決策樹的最大特徵數量
            If "auto", then max_features=sqrt(n_features).
            If "sqrt", then max_features=sqrt(n_features) (same as "auto").
            If "log2", then max_features=log2(n_features).
            If None, then max_features=n_features.
        bootstrap:boolean,optional(default = True)是否在構建樹時使用放回抽樣
        min_samples_split:節點劃分最少樣本數
        min_samples_leaf:葉子節點的最小樣本數
    '''
    titan = pd.read_csv('titanic.csv')
    x = titan[['pclass', 'age', 'sex']]
    y = titan['survived']
    #print(x['age'])
    x['age'].fillna(x['age'].mean(), inplace=True)
    #print(x['age'])
    dict = DictVectorizer(sparse=False)
    #轉化成字典並進行特徵抽取
    x = dict.fit_transform(x.to_dict(orient="records"))
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
    rs = RandomForestClassifier()
    #下面使用網格搜尋
    param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
    rs = GridSearchCV(rs, param_grid=param, cv=3)
    rs.fit(x_train, y_train)
    pred = rs.predict(x_test)
    print(accuracy_score(y_test,pred))
    return None

六、線性迴歸:

def line_regression():
    '''
    線性迴歸:一個自變數稱為單變量回歸,多個自變數稱為多元迴歸。找到最小損失,優化方法有正規方程和梯度下降兩種方式
    API1(正規方程):sklearn.linear_model.LinearRegression(fit_intercept=True)此為通過正規方程優化
            fit_intercept:是否計算偏置
            LinearRegression.coef_:迴歸係數
            LinearRegression.intercept_:偏置
    API2(梯度下降):sklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01)
            SGDRegressor類實現了隨機梯度下降學習,它支援不同的loss函式和正則化懲罰項來擬合線性迴歸模型。
            loss:損失型別
            loss=”squared_loss”: 普通最小二乘法
            fit_intercept:是否計算偏置
            learning_rate : string, optional
            學習率填充
            'constant': eta = eta0
            'optimal': eta = 1.0 / (alpha * (t + t0)) [default]
            'invscaling': eta = eta0 / pow(t, power_t)
            power_t=0.25:存在父類當中
            對於一個常數值的學習率來說,可以使用learning_rate=’constant’ ,並使用eta0來指定學習率。
            SGDRegressor.coef_:迴歸係數
            SGDRegressor.intercept_:偏置
    '''
    data = load_boston()
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=24)
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1,1))
    y_test = std_y.transform(y_test.reshape(-1,1))
    # 梯度下降進行預測
    lin = SGDRegressor()
    lin.fit(x_train, y_train)
    pre = lin.predict(x_test)
    print("權重:", lin.coef_)
    print("偏執:", lin.intercept_)
    print("預測結果:",pre)
    a = [x for x in range(len(pre))]
    plt.plot(a,pre,color = 'red')
    plt.plot(a,y_test,color = 'yellow')
    plt.show()

七、嶺迴歸

def lin_regression():
    '''
    嶺迴歸:一種線性迴歸,在迴歸時加上正則化限制,解決過擬合現象。有L1和L2兩種正則化方法,常用L2方法。正則化力度越大,權重係數越小,正則化力度越小,權重係數越大;
    L2正則化API:sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True,solver="auto", normalize=False)
                具有l2正則化的線性迴歸
                alpha:正則化力度,也叫λ,λ取值:0~1 1~10
                solver:會根據資料自動選擇優化方法
                sag:如果資料集、特徵都比較大,選擇該隨機梯度下降優化
                normalize:資料是否進行標準化
                normalize=False:可以在fit之前呼叫preprocessing.StandardScaler標準化資料
                Ridge.coef_:迴歸權重
                Ridge.intercept_:迴歸偏置
    '''
    data = load_boston()
    x_train, x_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.3, random_state=24)
    std_x = StandardScaler()
    x_train = std_x.fit_transform(x_train)
    x_test = std_x.transform(x_test)
    std_y = StandardScaler()
    y_train = std_y.fit_transform(y_train.reshape(-1, 1))
    y_test = std_y.transform(y_test.reshape(-1, 1))
    rd = Ridge(alpha=1.0)
    rd.fit(x_train, y_train)
    print("嶺迴歸的權重引數為:", rd.coef_)
    y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
    print("嶺迴歸的預測的結果為:", y_rd_predict)
    print("嶺迴歸的均方誤差為:", mean_squared_error(y_test, y_rd_predict))

八、邏輯迴歸

def logic_regression():
    '''
    邏輯迴歸:邏輯迴歸時解決二分類問題的利器,其輸入為一個線性迴歸的結果。
    API:sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
        solver:優化求解方式(預設開源的liblinear庫實現,內部使用了座標軸下降法來迭代優化損失函式)
        sag:根據資料集自動選擇,隨機平均梯度下降
        penalty:正則化的種類
        C:正則化力度
    分類評估API:sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )
                y_true:真實目標值
                y_pred:估計器預測目標值
                labels:指定類別對應的數字
                target_names:目標類別名稱
                return:每個類別精確率與召回率
    相關概念:精準率:召回率:準確率:
    應用:廣告點選率;是否為垃圾郵件;是否患病;金融詐騙;虛假賬號
    '''
    data = load_breast_cancer()
    x_train,x_test,y_train,y_test = train_test_split(data.data,data.target,random_state=30,train_size=0.8)
    lg = LogisticRegression()
    lg.fit(x_train,y_train)
    pre = lg.predict(x_test)
    print(confusion_matrix(y_test,pre))

九、聚類(k-means):

def kmeanss():
    '''
    聚類:
    API:sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++’)
        k-means聚類
        n_clusters:開始的聚類中心數量
        init:初始化方法,預設為'k-means ++’
        labels_:預設標記的型別,可以和真實值比較(不是值比較)
    輪廓係數評估API:sklearn.metrics.silhouette_score(X, labels)
                  計算所有樣本的平均輪廓係數
                  X:特徵值
                  labels:被聚類標記的目標值
    '''
    x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 9])
    x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 3])
    # x = np.array(list(zip(x1,x2)).reshape(len(x1),2))
    x = np.array(list(zip(x1, x2)))
    plt.figure(figsize=(10, 10))
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.title('sample')
    plt.scatter(x1, x2)
    plt.show()
    kmeans_model = KMeans(n_clusters=3).fit(x)
    colors = ['b', 'g', 'r']
    markers = ['o', '^', '+']
    for i, j in enumerate(kmeans_model.labels_):
        plt.plot(x[i], x2[i], colors=colors[j], markers=markers[j], ls='None')
    plt.xlim([0, 10])
    plt.ylim([0, 10])
    plt.show()
    print(x)

十、支援向量機(svm):

def svmm():
    '''
    支援向量機(完善):用超平面對高緯空間中的樣本進行分類,為了解決線性不可分問題,引入了核函式,常用核函式有線性核函式、多項式核函式、高斯核函式和sigmoid核函式
    API:sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True,
                probability=False, tol=0.001, cache_size=200, class_weight=None,
                verbose=False, max_iter=-1, decision_function_shape='ovr',
                random_state=None)
                C (float引數 預設值為1.0):懲罰項係數
                kernel (str引數 預設為‘rbf’):核函式選擇(linear:線性核函式,poly:多項式核函式,rbf:徑像核函式/高斯核,sigmod:sigmod核函式,precomputed:核矩陣)
                degree (int型引數 預設為3):只對'kernel=poly'(多項式核函式)有用,是指多項式核函式的階數n,如果給的核函式引數是其他核函式,則會自動忽略該引數。
                gamma (float引數 預設為auto):如果gamma設定為auto,代表其值為樣本特徵數的倒數,即1/n_features,也有其他值可設定。
                coef0:(float引數 預設為0.0):核函式中的獨立項,只有對‘poly’和‘sigmod’核函式有用,是指其中的引數c。
                probability( bool引數 預設為False):是否啟用概率估計。
                shrinkintol: float引數 預設為1e^-3g(bool引數 預設為True):表示是否選用啟發式收縮方式。
                tol( float引數 預設為1e^-3):svm停止訓練的誤差精度,也即閾值。
                cache_size(float引數 預設為200):指定訓練所需要的記憶體,以MB為單位。
                class_weight(字典型別或者‘balance’字串。預設為None):該引數表示給每個類別分別設定不同的懲罰引數C,如果沒有給,則會給所有類別都給C=1,即前面引數指出的引數C。如果給定引數‘balance’,則使用y的值自動調整與輸入資料中的類頻率成反比的權重。
                verbose ( bool引數 預設為False):是否啟用詳細輸出。
                max_iter (int引數 預設為-1):最大迭代次數,-1表示不受限制。
                random_state(int,RandomState instance ,None 預設為None):隨機數種子
    '''
    daj = load_digits()
    images = daj.images
    labels = daj.target
    n_samples = len(images)
    image_vectors = images.reshape((n_samples,-1))
    sample_index = list(range(n_samples))
    test_size = int(n_samples*2)
    random.shuffle(sample_index)
    train_index,test_index = sample_index[test_size:],sample_index[:test_size]
    x_train,y_train = image_vectors[train_index],labels[train_index]
    x_test, y_test = image_vectors[test_index], labels[test_index]
    classifier = SVC(kernel='rbf',C=1.0,gamma=0.001)
    classifier.fit(x_train,y_train)
    pre = classifier.predict(x_test)
    print(classification_report(y_test,pre))
    print(confusion_matrix(y_test,pre))