簡單來說機(jī)器學(xué)習(xí)就是講一段已經(jīng)存有的數(shù)據(jù),與數(shù)據(jù)對(duì)應(yīng)的結(jié)果通過機(jī)器學(xué)習(xí)的算法,得到估計(jì)函數(shù).然后再將需要預(yù)測的函數(shù)用估計(jì)函數(shù)得到預(yù)測結(jié)果

機(jī)器學(xué)習(xí)分類
- 有監(jiān)督學(xué)習(xí)
簡單來說就是已經(jīng)給了你數(shù)據(jù)并且給了數(shù)據(jù)所產(chǎn)生的結(jié)果
- 無監(jiān)督學(xué)習(xí)
在只有數(shù)據(jù)卻沒有結(jié)果的情況下,尋找影藏的模式或內(nèi)在結(jié)構(gòu)
- 半監(jiān)督學(xué)習(xí)
在半監(jiān)督學(xué)習(xí)方式下,訓(xùn)練數(shù)據(jù)有部分被標(biāo)識(shí),部分沒有被標(biāo)識(shí),這種模型首先需要學(xué)習(xí)數(shù)據(jù)的內(nèi)在結(jié)構(gòu),以便合理的組織數(shù)據(jù)來進(jìn)行預(yù)測。算法上,包括一些對(duì)常用監(jiān)督式學(xué)習(xí)算法的延伸,這些算法首先試圖對(duì)未標(biāo)識(shí)數(shù)據(jù)進(jìn)行建模,在此基礎(chǔ)上再對(duì)標(biāo)識(shí)的數(shù)據(jù)進(jìn)行預(yù)測。
有監(jiān)督學(xué)習(xí)
有監(jiān)督學(xué)習(xí)機(jī)器算法有分類和回歸兩類
分類主要用于數(shù)據(jù)分散,且預(yù)測結(jié)果只分為幾類,常用的分類機(jī)器算法有以下幾種:
- k-鄰近算法
K近鄰(k-Nearest Neighbor,KNN)分類算法的核心思想是如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別
#導(dǎo)入KNN算法
from sklearn.neighbors import KNeighborsClassfier
knn = KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=1, **kwargs)
# n_neighbors每個(gè)類別取多少個(gè)點(diǎn)來算距離一般不大于10,weights預(yù)測的權(quán)函數(shù)有uniform與distance兩種,p是使用距離度量參數(shù) metric 附屬參數(shù),只用于閔可夫斯基距
#離和帶權(quán)重閔可夫斯基距離中p值的選擇,p=1為曼哈頓距離, p=2為歐式距離。默認(rèn)為2
knn.fit(x_train,y_train)#訓(xùn)練數(shù)據(jù),x_train為用來訓(xùn)練的數(shù)據(jù),y_train為數(shù)據(jù)所對(duì)應(yīng)的結(jié)果
knn.score(x_train,y_train)#得出訓(xùn)練數(shù)據(jù)的得分
y_ = knn.predict(x_test) #用測試數(shù)據(jù)去算出預(yù)測結(jié)果
knn.score(x_test,y_test)#測試數(shù)據(jù)的得分
#y_test,是x_test對(duì)應(yīng)的正確結(jié)果,而y_是根據(jù)knn.fit()訓(xùn)練完后去預(yù)測的結(jié)果
- Logistics邏輯斯蒂回歸分類
根據(jù)現(xiàn)有數(shù)據(jù)對(duì)分類邊界線建立回歸公式,以此進(jìn)行分類。這里的“回歸” 一詞源于最佳擬合,表示要找到最佳擬合參數(shù)集。
Logistic Regression和Linear Regression的原理是相似的,可以簡單的描述為這樣的過程:
(1)找一個(gè)合適的預(yù)測函數(shù),一般表示為h函數(shù),該函數(shù)就是我們需要找的分類函數(shù),它用來預(yù)測輸入數(shù)據(jù)的判斷結(jié)果。這個(gè)過程是非常關(guān)鍵的,需要對(duì)數(shù)據(jù)有一定的了解或分析,知道或者猜測預(yù)測函數(shù)的“大概”形式,比如是線性函數(shù)還是非線性函數(shù)。
(2)構(gòu)造一個(gè)Cost函數(shù)(損失函數(shù)),該函數(shù)表示預(yù)測的輸出(h)與訓(xùn)練數(shù)據(jù)類別(y)之間的偏差,可以是二者之間的差(h-y)或者是其他的形式。綜合考慮所有訓(xùn)練數(shù)據(jù)的“損失”,將Cost求和或者求平均,記為J(θ)函數(shù),表示所有訓(xùn)練數(shù)據(jù)預(yù)測值與實(shí)際類別的偏差。
(3)顯然,J(θ)函數(shù)的值越小表示預(yù)測函數(shù)越準(zhǔn)確(即h函數(shù)越準(zhǔn)確),所以這一步需要做的是找到J(θ)函數(shù)的最小值。找函數(shù)的最小值有不同的方法,Logistic Regression實(shí)現(xiàn)時(shí)有梯度下降法(Gradient Descent)。
損失值簡單來說就是(y_-y_test)^2求平均
from sklearn.linear_model import LogisticRegression
logistic = LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='liblinear', max_iter=100, multi_class='ovr', verbose=0, warm_start=False, n_jobs=1)
#solver參數(shù)的選擇:
#“l(fā)iblinear”:小數(shù)量級(jí)的數(shù)據(jù)集
#“l(fā)bfgs”, “sag” or “newton-cg”:大數(shù)量級(jí)的數(shù)據(jù)集以及多分類問題
#“sag”:極大的數(shù)據(jù)集
#C懲罰項(xiàng),用來去除權(quán)重交小的參數(shù)
logistic.fit(x_train,y_train)
logistic.score(x_train,y_train)
y_ = logistic.predict(x_test)
-
決策樹
下圖為一個(gè)女孩的相親決定綠色表示為條件也就是特征,黃色則為結(jié)果
image.png
構(gòu)造決策樹的關(guān)鍵步驟是分裂屬性。所謂分裂屬性就是在某個(gè)節(jié)點(diǎn)處按照某一特征屬性的不同劃分構(gòu)造不同的分支,其目標(biāo)是讓各個(gè)分裂子集盡可能地“純”。盡可能“純”就是盡量讓一個(gè)分裂子集中待分類項(xiàng)屬于同一類別。分裂屬性分為三種不同的情況:
1、屬性是離散值且不要求生成二叉決策樹。此時(shí)用屬性的每一個(gè)劃分作為一個(gè)分支。
2、屬性是離散值且要求生成二叉決策樹。此時(shí)使用屬性劃分的一個(gè)子集進(jìn)行測試,按照“屬于此子集”和“不屬于此子集”分成兩個(gè)分支。
3、屬性是連續(xù)值。此時(shí)確定一個(gè)值作為分裂點(diǎn)split_point,按照>split_point和<=split_point生成兩個(gè)分支。
from sklearn.tree import DecisionTreeClassfier
tree = DecisionTreeClassfier(max_depth)
tree.fit(x_train,y_train)#訓(xùn)練數(shù)據(jù),x_train為用來訓(xùn)練的數(shù)據(jù),y_train為數(shù)據(jù)所對(duì)應(yīng)的結(jié)果
tree.score(x_train,y_train)#得出訓(xùn)練數(shù)據(jù)的得分
y_ = tree.predict(x_test) #用測試數(shù)據(jù)去算出預(yù)測結(jié)果
tree.score(x_test,y_test)#測試數(shù)據(jù)的得分
#max_depth為決策深度,需要調(diào)節(jié),過高容易過擬合,而過低容易欠擬合
- 貝葉斯(用法與其他算法)
- 高斯分布樸素貝葉斯
用于一般的分類問題,from sklearn.naive_bayes import GaussianNB
- 伯努利樸素貝葉斯
常用于二分類的分類問題,from sklearn.naive_bayes import BernoulliNB
- 多項(xiàng)式樸素貝葉斯
用于文本數(shù)據(jù),如垃圾短信分類等,from sklearn.naive_bayes import MultinomialNB
- 補(bǔ)充,當(dāng)對(duì)文本分析的時(shí)候需要將文本內(nèi)容轉(zhuǎn)換
from sklearn.feature_extraction.text import TfidfVectorizer tf = TfidfVectorizer() tf.fit(data)#data為文本數(shù)據(jù) X_train = tf.transform(data).toarray()#轉(zhuǎn)換成能使用的訓(xùn)練數(shù)據(jù)
- 高斯分布樸素貝葉斯
- 支持向量機(jī)SVM
原理:支持向量機(jī),其含義是通過支持向量運(yùn)算的分類器。其中“機(jī)”的意思是機(jī)器,可以理解為分類器。 那么什么是支持向量呢?在求解的過程中,會(huì)發(fā)現(xiàn)只根據(jù)部分?jǐn)?shù)據(jù)就可以確定分類器,這些數(shù)據(jù)稱為支持向量。且SVM的優(yōu)點(diǎn)就在于可支持線性與非線性分類,而其中線性分類可以理解為這些有n個(gè)屬性和一個(gè)二分類標(biāo)志,而這個(gè)n個(gè)屬性是存在于n維的空間中,而線性分類就是要尋找一個(gè)能使這個(gè)超平面能將n個(gè)屬性分成兩類,且離兩類的距離最大的超平面.而非線性的話,簡單來說會(huì)更靈活.
image.png
如圖中,只根據(jù)幾個(gè)點(diǎn)就能得出最適合的分類線
# 比較幾種核函數(shù)
#導(dǎo)入鳶尾花數(shù)據(jù)
from sklearn.datasets import load_iris
#svm中的svc是做分類,而svm是做回歸
from sklearn.svm import SVC,LinearSVC
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
data = load_iris()['data'][:,0:2]
target = load_iris()['target']
# 取data中的兩個(gè)特征畫點(diǎn)
x_min,x_max = data[:,0].min(),data[:,0].max()
y_min,y_max = data[:,1].min(),data[:,1].max()
# 設(shè)置面的范圍
x,y = np.linspace(x_min,x_max,1000),np.linspace(y_min,y_max,1000)
# 創(chuàng)建網(wǎng)格
X,Y = np.meshgrid(x,y)
# 創(chuàng)建預(yù)測數(shù)據(jù)
x_test = np.c_[X.ravel(),Y.ravel()]
#將svc核設(shè)置為線性
plt.figure(figsize=(5*4,4))
index = 1
for i in ['linear', 'poly', 'rbf']:
svc = SVC(kernel=i)
svc.fit(data,target)
y_ = svc.predict(x_test)
#設(shè)置每個(gè)圖的位置
axes = plt.subplot(1,4,index)
#畫出面
axes.pcolormesh(X,Y,y_.reshape(1000,1000))
#畫出點(diǎn)做對(duì)比
axes.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
#設(shè)置標(biāo)題
axes.set_title(i)
index += 1
#在加入Linearsvc比較
Linearsvc = LinearSVC()
Linearsvc.fit(data,target)
y_ = svc.predict(x_test)
axes = plt.subplot(1,4,4)
axes.pcolormesh(X,Y,y_.reshape(1000,1000))
axes.scatter(data[:,0],data[:,1],c=target,cmap='rainbow')
axes.set_title('linearsvc')

而回歸則是用在數(shù)據(jù)是連續(xù)的,并且預(yù)測結(jié)果明顯是不同的.例如溫度變化或時(shí)間變化.包括一元回歸和多元回歸,線性回歸和非線性回歸,回歸的機(jī)器算法有以下幾種:
- LinearRegression普通線性回歸
原理:假定輸人數(shù)據(jù)存放在矩陣X中,而回歸系數(shù)存放在向量W中。那么對(duì)于給定的數(shù)據(jù)X1, 預(yù)測結(jié)果將會(huì)通過
Y=XW
Y=X1W1+X2W2+X3W3+.......(幾個(gè)特征就會(huì)有幾個(gè)回歸系數(shù),通過算法可以找出這些回歸系數(shù))
給出?,F(xiàn)在的問題是,手里有一些X和對(duì)應(yīng)的Y,怎樣才能找到W呢?
一個(gè)常用的方法就是找出使誤差最小的W。這里的誤差是指預(yù)測Y值和真實(shí)Y值之間的差值,使用該誤差的簡單累加將使得正差值和負(fù)差值相互抵消,所以我 們采用平方誤差。
最小二乘法:

from sklearn.linear_model import LinearRegression
linear = LinearRegression()
linear.fit(x_train,y_train)
y_ = linear(x_test)
linear.coef_ #回歸系數(shù)
linear.intercept_ #截距

- Ridge嶺回歸
當(dāng)數(shù)據(jù)的特征比樣本點(diǎn)還多的時(shí)候,輸入的矩陣X就不是滿秩矩陣將不可逆所以就引入Ridege嶺回歸,簡單來說就引入一個(gè)懲罰項(xiàng)λ使矩陣X成為滿秩矩陣可逆,并且去掉一些不重要的參數(shù),適用于一些過擬合或各邊存在多重共線性的時(shí)候
from sklearn.linear_model import Ridge
ridge= Ridge(alpha)
ridge.fit(x_train,y_train)
y_ = ridge(x_test)
ridge.coef_ #回歸系數(shù)
ridge.intercept_ #截距
#alpha就是λ懲罰項(xiàng)
- Lasso回歸
#與嶺回歸相似
from sklearn.linear_model import Lasso
lasso= Lasso(alpha)
lasso.fit(x_train,y_train)
y_ = lasso(x_test)
lasso.coef_ #回歸系數(shù)
lasso.intercept_ #截距
#alpha就是λ懲罰項(xiàng)
#Lasso效果會(huì)比嶺回歸好
- K-鄰近算法也可用于回歸
from sklearn.neighbors import KNeighborsRegressor
- 決策樹也可以用于回歸問題
from sklearn.tree import DecisionTreeRegressor
- svm中SVR也可以解決回歸問題
from sklearn.svm import SVR

