環(huán)境配置:Scikit-learn包
只支持python語言
安裝
Win+R ,輸入指令:pip install -U scikit-learn
Part 0. 數(shù)據(jù)預(yù)處理
數(shù)據(jù)導(dǎo)入
借助pandas和numpy 進(jìn)行數(shù)據(jù)導(dǎo)入與處理
字符串類label的數(shù)字化編碼
機(jī)器學(xué)習(xí)的函數(shù)大部分只能對(duì)數(shù)字信息進(jìn)行處理,無法對(duì)string類數(shù)據(jù)進(jìn)行分析,因此需要將string類信息進(jìn)行編碼數(shù)字化
參考blog鏈接,可進(jìn)行補(bǔ)碼
Part 1. 機(jī)器學(xué)習(xí)之線性回歸
問題描述
給定數(shù)據(jù)集 [x1,x2,x3,…,y],擬合y與各個(gè)因子之間的關(guān)系
內(nèi)部算法的原理概述
求到最合適的y=a*x+b,使得偏差最小;即尋找a,b,使得偏差函數(shù)dif(a,b)取最小值
擬合原理:在偏差函數(shù)上,基于 “模擬退火” 算法,對(duì)a,b進(jìn)行求解。
單因子擬合
求解線性方程
from sklearn.linear_model import LinearRgression
lr_model = LinearRegression()
lr_model.fit(x,y) #這里的x和y應(yīng)當(dāng)是 形狀為n*2的數(shù)組類型
a = lr_model.coef_
b = lr_model.intercept_
預(yù)測新數(shù)據(jù)
predictions = lr_model.predict(x_new) #x_new為一維數(shù)組
模型評(píng)估
均方誤差MSE:
R方值:
MSE越小越好,R2 越接近1越好
from sklearn.metrics import mean_squared_error, r2_score
MSE = mean_squared_error(y,y_predict)
R2 = r2_score(y,y_predict)
可視化評(píng)估
from matplotlib import pyplot as plt
plt.scatter(y,y') # y和y‘差別越小,成圖就越接近直線
多因子擬合 線性回歸
擬合
X_multi = data.drop(['y'],axis=1) #除去y軸因子,其他因子均為影響因子
LR_multi = LinearRegression()
LR_multi.fit(X_multi,y) # 求解X_multi與y的關(guān)系
預(yù)測
y_predict_multi = LR_multi.predict(X_multi_query) # 預(yù)測值
評(píng)估
R方值:
mean_squared_error_multi = mean_squared_error(y,y_predict_multi)
r2_score_multi = r2_score(y,y_predict_multi)
print(r2_score_multi)
可視化(看y和預(yù)測y的差值情況)
fig = plt.figure(figsize=(8,5))
plt.scatter(y,y_predict_1)
plt.show()
Part 2. 機(jī)器學(xué)習(xí)之邏輯回歸
問題描述
分類問題: 垃圾郵件檢測、預(yù)測學(xué)生是否可以通過考試、圖像分類
給定數(shù)據(jù)集,每個(gè)數(shù)據(jù)都具有多個(gè)特征要素,并給定其分類標(biāo)簽。該回歸模型就是對(duì) 對(duì)象特征 進(jìn)行識(shí)別,根據(jù) 特征、分類結(jié)果
算法邏輯
將“特征描述”進(jìn)行數(shù)字化,轉(zhuǎn)換成數(shù)字?jǐn)?shù)據(jù)
對(duì)曲線進(jìn)行擬合的方法,除了線性回歸以外,還包括且不限于 分段函數(shù)、復(fù)雜函數(shù)等等.
“特征描述”數(shù)字化后,得到 特征值–分類標(biāo)簽 的散點(diǎn)圖
通過與“線性回歸”類似的算法原理,對(duì)“分界曲線”進(jìn)行擬合
藍(lán)線為擬合出的分界曲線
邏輯回歸的損失函數(shù)
擬合、預(yù)測
from sklearn.linear_model import LogisticRegression
lr_model = LogisticRegression()
lr_model.fit(x,y) # 填入散點(diǎn)數(shù)據(jù),x為特征值,y為分類標(biāo)簽
#分界函數(shù) (系數(shù)計(jì)算)
theta1,theta2 = LR.coef_[0][0],LR.coef_[0][1]
theta0 = LR.intercept_[0]
#新數(shù)據(jù)的類別預(yù)測
predictions = lr_model.predict(x_new)
評(píng)估
準(zhǔn)確率: Accuracy = 正確數(shù) / 總數(shù)
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,y_predict)
Part 3. 機(jī)器學(xué)習(xí)之聚類
KMeans: K均值聚類算法
算法定義:
以空間k個(gè)點(diǎn)為中心進(jìn)行聚類,對(duì)最靠近他們的對(duì)象歸類,是最基礎(chǔ)且最重要的聚類算法
算法流程:
step 1. 選擇聚類的個(gè)數(shù)k
step 2. 隨機(jī)選定這k個(gè)聚類中心的位置
step 3. 根據(jù)點(diǎn)到聚類中心的距離確定各個(gè)點(diǎn)的所屬類別
step 4.根據(jù)各個(gè)類別的數(shù)據(jù)更新聚類中心(取他們的均值為新的中心)
step 5. 重復(fù)step2~step5,直至中心點(diǎn)不再變化
代碼實(shí)現(xiàn)
聚類擬合
from sklearn.cluster import KMeans
KM = KMeans(n_cluster=3,random_state=0) # n_cluster=想要分為的類別數(shù),random_state初始的隨機(jī)狀態(tài)
KM.fit( point ) # point為2D點(diǎn)集數(shù)據(jù)
centers = KM.cluster_centers_ #獲取模型確定的中心點(diǎn)
預(yù)測
pred_label = KM.predict( [ [8,6] ] )
print(pred_label)
評(píng)估-準(zhǔn)確率
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,pred_y)
類別標(biāo)簽矯正
y_cal = [] #矯正結(jié)果數(shù)組
for i in pred_y:
if i == 'lable_name1':
y_cal.append(2)
elif i == 1:
y_cal.append(1)
else:
y_cal.append(0)
print(pred_y,y_cal)
KNN算法:K nearest neighbor, K近鄰分類模型
算法定義
給定樣本數(shù)據(jù)集,對(duì)新的輸入實(shí)例進(jìn)行預(yù)測
預(yù)測方法為:在樣本數(shù)據(jù)集中找到與該實(shí)例最鄰近的k個(gè)樣本,這k個(gè)樣本中出現(xiàn)最多次的類別,就是這個(gè)輸入實(shí)例 的被預(yù)測類別
代碼實(shí)現(xiàn)
擬合
# 擬合
from sklearn.neighbors import KNeighborsClassifier
KNN = KNeighborsClassifier(n_neighbors=3)
# n_neibors = 想要分為3類
KNN.fit(point,label)
預(yù)測
# 預(yù)測
pred_label = KNN.predict( [[8,6]] )
print(pred_label)
pred_label = KNN.predict( point )
print(pred_label)
## KNN模型為監(jiān)督式機(jī)器學(xué)習(xí),無需另外匹配標(biāo)簽
評(píng)估
# 評(píng)估
from sklearn.metrics import accuracy_score
print('accuracy:',accuracy_score(label,pred_label))
Mean-shift算法:均值漂移聚類算法
算法定義
一種基于密度梯度上升的聚類算法(沿著密度上升方向?qū)ふ揖垲愔行狞c(diǎn))
就是不斷地把中心點(diǎn)移動(dòng)到點(diǎn)聚集的地方,但需要提前預(yù)判聚類圓的半徑
代碼實(shí)現(xiàn)
聚類擬合
from sklearn.cluster import MeanShift,estimate_bandwidth
# 估計(jì)聚類圓的半徑
bandwidth = estimate_bandwidth( X, n_samples=500)
# X 為樣本點(diǎn)集數(shù)據(jù), n_samples表示樣本數(shù)量
評(píng)估-準(zhǔn)確率
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y,pred_y)
類別標(biāo)簽矯正
y_cal = [] #矯正結(jié)果數(shù)組
for i in pred_y:
if i == 'lable_name1':
y_cal.append(2)
elif i == 1:
y_cal.append(1)
else:
y_cal.append(0)
print(pred_y,y_cal)
個(gè)人想法: 我感覺可以用并查集 寫一段自動(dòng)匹配
Part 4. 機(jī)器學(xué)習(xí)之決策樹
Decision Tree
跟深搜一個(gè)邏輯,就是多層判斷,不斷深搜,最終找到答案。
優(yōu)點(diǎn):計(jì)算量小、易于理解
缺點(diǎn):忽略了屬性之間的相關(guān)性:可能有幾層判斷,其實(shí)是相關(guān)的;如果樣本分布不均勻,會(huì)很容易影響模型表現(xiàn)
ID3 決策樹算法
算法定義
利用信息熵原理,選擇信息增益最大的屬性作為分類屬性,遞歸拓展決策樹的分支,完成決策樹的構(gòu)造
大白話就是:決策樹需要有確定影響決策的“因素”有哪些,這些因素不需要人工輸入,可以根據(jù)ID3算法直接獲取。
代碼實(shí)現(xiàn)
決策樹實(shí)現(xiàn)分類
from sklearn import tree
dc_tree = tree.DecisionTreeClassifier(
criterion='entropy',min_samples_leaf=5)
# 使用'entropy'即ID3信息熵算法,分類標(biāo)簽有5個(gè)
#leaf指決策樹的每個(gè)葉子節(jié)點(diǎn)未繼續(xù)分類的樣本數(shù)量的最小值,leaf越小越精確度越高
dc_tree.fit( point , label)
可視化決策樹
tree.plot_tree(dc_tree,filled='True',feature_names=['表頭名1','表頭名2','表頭名3','表頭名4'],class_names=['label1','label2','label3'])
其他決策樹算法【待填】
C4.5決策樹算法【待填】
CART決策樹算法【待填】
Part 5. 機(jī)器學(xué)習(xí)之異常檢測
Anomaly Detection
概念
對(duì)輸入的樣本數(shù)據(jù)集,對(duì)不符合預(yù)期模式的數(shù)據(jù)進(jìn)行識(shí)別
實(shí)現(xiàn)邏輯:計(jì)算可得每個(gè)位置的概率密度,視概率密度低于一定值的點(diǎn)集為異常點(diǎn)集。
數(shù)學(xué)原理:任意分布可視為高斯分布,基于高斯分布擬合對(duì)樣本數(shù)據(jù)集進(jìn)行異常檢測
代碼實(shí)現(xiàn)
原始數(shù)據(jù)分布可視化
plt.hist(x1,bins=100)
#視x1的值為被觀測值,劃分為100個(gè)格子,查看其分布概率圖
x1_mean = x1.mean() # u,正態(tài)分布的均值
x1_sigma = x1.std() # sigma 正態(tài)分布的標(biāo)準(zhǔn)差
print(x1_mean,x1_sigma)
#計(jì)算高斯分布數(shù)值
from scipy.stats import norm
import numpy as np
x1_range = np.linspace(0,20,300) #x1的范圍為(0,20),有300個(gè)點(diǎn)
normal1 = norm.pdf(x1_range,x1_mean,x1_sigma) #對(duì)range范圍內(nèi),做分布為N(mean,sigma)的高斯分布, 最終normal1為概率密度函數(shù)
plt.plot(x1_range,normal1)
#繪制出擬合的高斯分布曲線
模型訓(xùn)練
from sklearn.covariance import EllipticEnvelope
clf = EllipticEnvelope(
contamination = 0.01
#參數(shù)contamination表示所給樣本數(shù)據(jù)集的異常概率
)
clf.fit( data ) #data為被檢測的數(shù)據(jù)集合
模型結(jié)果
# 異常點(diǎn)顯示、異常行為預(yù)測
pred_label = clf.predict(data)
print(pred_label)
# 異常點(diǎn)值為-1,正常點(diǎn)值為1
異常數(shù)據(jù)可視化
#在繪制原圖代碼的后面,加上下列代碼
anamoly_points = plt.scatter(
data.loc[:,'x1'][y_predict==-1], # 選取值為-1的異常數(shù)據(jù)
data.loc[:,'x2'][y_predict==-1]. # 選取值為-1的異常數(shù)據(jù)
marker='o', #異常數(shù)據(jù)用O圈起來
facecolor = 'red',#填充色
edgecolor = 'red', #邊線色
s=250 #size大小
)
Part 6. 機(jī)器學(xué)習(xí)之主成分分析
PCA
數(shù)據(jù)降維
- 篩除應(yīng)變量 “不相關(guān)”的因變量,篩除“不相關(guān)要素”
- 組合“相關(guān)”元素:比如 人口、地理面積的二維數(shù)據(jù),可以組合為 人口密度的一維數(shù)據(jù)
注:相關(guān)不相關(guān)的依據(jù)是,概率論中的“協(xié)方差”概念
PCA算法:principal components analysis
在信息損失盡可能少的情況下,降低數(shù)據(jù)維度
在n維樣本數(shù)據(jù)集中,尋找k維的新數(shù)據(jù),實(shí)現(xiàn)n->k的降維。
代碼實(shí)現(xiàn)
數(shù)據(jù)預(yù)處理
將普通正態(tài)分布轉(zhuǎn)換為標(biāo)準(zhǔn)正態(tài)分布
from sklearn.preprocessing import StandardScaler
X_norm = StandardScaler().fit_transform(X)
# X為數(shù)據(jù)的原分布
獲取降維數(shù)據(jù)
from sklearn.decomposition import PCA
pca = PCA(n_components=4) #降維至 4維
X_reduced = pca.fit_transform(X_norm)
觀察各個(gè)要素的方差比例
var_ratio = pca.explained_variance_ratio_
#比例越高,相關(guān)性越高
可視化降維后的數(shù)據(jù)
借助 matplotlib 繪制 分類散點(diǎn)圖即可文章來源:http://www.zghlxwxcb.cn/news/detail-430037.html
Part x. 模型評(píng)估與優(yōu)化
博客跳轉(zhuǎn):【人工智能】模型評(píng)價(jià)與優(yōu)化文章來源地址http://www.zghlxwxcb.cn/news/detail-430037.html
到了這里,關(guān)于【python】scikit-learn包:機(jī)器學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!