線性迴歸算法
正規方程
利用固定的公式求解[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