機器學習筆記-03

線性迴歸算法

正規方程

利用固定的公式求解[w1,w2……,wn]的權值,適用範圍爲特徵值數目比較少且訓練集的數量較少,大數據情況下會讓矩陣變的十分龐大難以計算。

from sklearn.datasets import load_digits,load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor,  Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
from sklearn.externals import joblib
def mylinear1():
    """
    線性迴歸直接預測房子價格
    :return: None
    """
    # 獲取數據
    lb = load_boston()

    # 分割數據集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)

    # 進行標準化處理(?) 目標值處理?
    # 特徵值和目標值是都必須進行標準化處理, 實例化兩個標準化API
    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))

    # # 預測房價結果
    # model = joblib.load("./tmp/test.pkl")
    #
    # y_predict = std_y.inverse_transform(model.predict(x_test))
    #
    # print("保存的模型預測的結果:", y_predict)

    # estimator預測
    # 正規方程求解方式預測結果
    lr = LinearRegression()

    lr.fit(x_train, y_train)

    print(lr.coef_)

    # 保存訓練好的模型
    joblib.dump(lr, "./test.pkl")

    # 預測測試集的房子價格
    y_lr_predict = std_y.inverse_transform(lr.predict(x_test))

    print("正規方程測試集裏面每個房子的預測價格:", y_lr_predict)

    print("正規方程的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))

    return None

梯度下降

本質計算損失函數的梯度,損失函數爲所有預測值與實際值差的平方。
計算二維甚至多維空間下平面或者超平面的梯度,選擇梯度方向的反方向按照一定的學習步長尋找損失函數最小值,會出現局部最優解的情況,即梯度下降到鞍點。

from sklearn.datasets import load_digits,load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor,  Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
def mylinear2():
    '''
    梯度下降算法
    :return: None
    '''
    # 獲取數據
    lb = load_boston()

    # 分割數據集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)

    # 進行標準化處理(?) 目標值處理?
    # 特徵值和目標值是都必須進行標準化處理, 實例化兩個標準化API
    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))

    # 梯度下降去進行房價預測
    sgd = SGDRegressor()

    sgd.fit(x_train, y_train)

    print(sgd.coef_)

    # 預測測試集的房子價格
    y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))

    print("梯度下降測試集裏面每個房子的預測價格:", y_sgd_predict)

    print("梯度下降的均方誤差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))

    return None

嶺迴歸

具有L2正則化的線性最小二乘法。嶺迴歸是一種專用於共線性數據分析的有偏估計迴歸方法,實質上是一種改良的最小二乘估計法,通過放棄最小二乘法的無偏性,以損失部分信息、降低精度爲代價獲得迴歸係數更爲符合實際、更可靠的迴歸方法,對病態數據的擬合要強於最小二乘法。當數據集中存在共線性的時候,嶺迴歸就會有用。

from sklearn.datasets import load_digits,load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor,  Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
def mylinear3():
    '''
    嶺迴歸
    :return: None
    '''

    # 獲取數據
    lb = load_boston()

    # 分割數據集到訓練集和測試集
    x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)

    print(y_train, y_test)

    # 進行標準化處理(?) 目標值處理?
    # 特徵值和目標值是都必須進行標準化處理, 實例化兩個標準化API
    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(std_y.inverse_transform(y_test), y_rd_predict))

    return None

邏輯迴歸

主要適用於二分問題,即非真即假,非黑即白類型的問題,本質仍然是線性迴歸,只不過加上了神經網絡會使用到的激活函數sigmod將結果轉化爲0,1的概率。

from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits,load_boston
from sklearn.linear_model import LinearRegression, SGDRegressor,  Ridge, LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, classification_report
from sklearn.externals import joblib
import pandas as pd
import numpy as np
def logistic():
    """
    邏輯迴歸做二分類進行癌症預測(根據細胞的屬性特徵)
    :return: NOne
    """
    # 構造列標籤名字
    column = ['Sample code number','Clump Thickness', 'Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion', 'Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class']

    # 讀取數據
    data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data", names=column)

    print(data)

    # 缺失值進行處理
    data = data.replace(to_replace='?', value=np.nan)

    data = data.dropna()

    # 進行數據的分割
    x_train, x_test, y_train, y_test = train_test_split(data[column[1:10]], data[column[10]], test_size=0.25)

    # 進行標準化處理
    std = StandardScaler()

    x_train = std.fit_transform(x_train)
    x_test = std.transform(x_test)

    # 邏輯迴歸預測
    lg = LogisticRegression(C=1.0)

    lg.fit(x_train, y_train)

    print(lg.coef_)

    y_predict = lg.predict(x_test)

    print("準確率:", lg.score(x_test, y_test))

    print("召回率:", classification_report(y_test, y_predict, labels=[2, 4], target_names=["良性", "惡性"]))

    return None

K-mean聚類算法

無監督學習的一種辦法,根據給定的k值將訓練集的數據分割成k個不同的部分。
1.首先,隨機設K個特徵空間內的點作爲初始的聚類中心。
2.然後,對於根據每個數據的特徵向量,從K個聚類中心中尋找距離最近的一個,並且把該數據標記爲這個聚類中心。
3.接着,在所有的數據都被標記過聚類中心之後,根據這些數據新分配的類簇,通過取分配給每個先前質心的所有樣本的平均值來創建新的質心重,新對K個聚類中心做計算。
4.最後,計算舊和新質心之間的差異,如果所有的數據點從屬的聚類中心與上一次的分配的類簇沒有變化,那麼迭代就可以停止,否則回到步驟2繼續循環。

from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
def kmeans():
    """
    手寫數字聚類過程
    :return: None
    """
    # 加載數據

    ld = load_digits()

    print(ld.target[:20])

    # 聚類
    km = KMeans(n_clusters=810)

    km.fit_transform(ld.data)

    print(km.labels_[:20])

    print(silhouette_score(ld.data,km.labels_))

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