(scikit-learn里面內(nèi)容太多了怯伊,把各個模塊拆分一下几颜,并且挑重點的說婿脸。)
詳細文檔:
https://scikit-learn.org/stable/
https://github.com/apachecn/sklearn-doc-zh
1咽弦、sklearn 預處理
5.3 數(shù)據(jù)變換
- 標準化
講一下幾個模塊的區(qū)別:
數(shù)據(jù)標準化
StandardScaler (基于特征矩陣的列,將屬性值轉換至服從正態(tài)分布)
標準化是依照特征矩陣的列處理數(shù)據(jù)胎挎,其通過求z-score的方法沟启,將樣本的特征值轉換到同一量綱下
常用與基于正態(tài)分布的算法忆家,比如回歸
from sklearn import preprocessing
standard_scaler = preprocessing.StandardScaler()
X_train_standard = standard_scaler.fit_transform(X_train)
standard_scaler.mean_ #查看每列均值
standard_scaler.var_ #查看每列方差
數(shù)據(jù)歸一化
MinMaxScaler (區(qū)間縮放,基于最大最小值德迹,將數(shù)據(jù)轉換到特定區(qū)間上芽卿,默認是0~1,也可以對feature_range參數(shù)進行設置)
提升模型收斂速度胳搞,提升模型精度
常見用于神經(jīng)網(wǎng)絡
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler((0,1)) #構建模型卸例,如果不設置范圍參數(shù),則默認是0~1
X_train_minmax = min_max_scaler.fit_transform(X_train) #使用模型肌毅,肯定是以列進行訓練哈
min_max_scaler.data_max_ #查看每列最大值
min_max_scaler.data_min_ #查看每列最小值
范式歸一化(查看后面)
Normalizer (基于矩陣的行筷转,將樣本向量轉換為單位向量)
其目的在于樣本向量在點乘運算或其他核函數(shù)計算相似性時,擁有統(tǒng)一的標準
常見用于文本分類和聚類悬而、logistic回歸中也會使用呜舒,有效防止過擬合,目前沒有遇到過笨奠。
from sklearn import preprocessing
normalizer = preprocessing.Normalizer(norm='l2')
X_normalized = normalizer.fit_transform(X)
標準化后的數(shù)據(jù)可以用numpy函數(shù)查看其均值和標準差袭蝗,如果是標準化轉換的話,均值和標準差肯定是0和1般婆。
X_train_minmax.mean(axis=0) #每列的均值到腥,為0
X_train_minmax.std(axis=0) #每列的標準差,為1
上面的min_max_scaler是已經(jīng)訓練好的縮放標準腺兴,每列的最大值和最小值都知道了左电,可以用這個標準來縮放其他數(shù)據(jù)(比如新來了一行數(shù)據(jù))廉侧。
X_train_new_minmax = min_max_scaler.transform(X_train_new) #已經(jīng)訓練好的模型
- 非線性轉換-轉換為分位數(shù)(0~1之間)
from sklearn import preprocessing
quantile_transformer = preprocessing.QuantileTransformer(random_state=0)
X_train_trans = quantile_transformer.fit_transform(X_train)
- 非線性轉換-高斯變換
有一些簡單的變換页响,比如說指數(shù)變換、對數(shù)變換可以直接np函數(shù)處理段誊,這里sklearn提供了高斯變換的模型闰蚕,但是具體場景要應用變換的情況應該比較少,這里也不研究连舍。 - 類別特征編碼
from sklearn import preprocessing
enc = preprocessing.OrdinalEncoder()
enc.fit(X) #模型訓練没陡,實際上第一行全部編碼為0,第n行編碼為n-1索赏,這樣的一種對應關系盼玄,所以這里的X應當是需要編碼的一個特征矩陣
enc.transform(X1) #上述模型,將X1編碼潜腻,X1也是需要編碼的特征矩陣
另外針對無序的特征埃儿,如果不適合采用連續(xù)數(shù)值編碼,可以采用獨熱編碼融涣,可以參見https://www.cnblogs.com/zongfa/p/9305657.html
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit(X) # fit來學習編碼
enc.transform(X1).toarray() # 進行編碼
- 離散化
k-bins離散方法用k個等寬的bins把特征離散化
from sklearn import preprocessing
est = preprocessing.KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal').fit(X) #針對三列數(shù)據(jù)童番,分別分為3\2\2個bins精钮,最后編碼采用0~n-1的編碼方式
est.transform(X) #進行離散化
當然也會有分位數(shù)的離散化方式,可以采用KBinsDiscretizer
來實現(xiàn)剃斧。
- 二值化
設定閾值轨香,不超過閾值的就為0:
from sklearn import preprocessing
binarizer = preprocessing.Binarizer(threshold=0) #構建模型
binarizer.fit_transform(X)
- 生成多項式特征
構建多項式特征來增加模型復雜度:
from sklearn import preprocessing
poly = preprocessing.PolynomialFeatures(2) #構建二次多項式模型
poly.fit_transform(X)
X 的特征已經(jīng)從(X1,X2)擴展為(1,X1幼东,X1平方臂容,2,X2根蟹,X2平方)策橘。
也可以通過參數(shù)設置來構建比如像X1*X2的較差項。一般這種比較簡單直接的函數(shù)也可以調(diào)用np實現(xiàn)娜亿。
5.4 缺失值插補
sklearn插補方法不同于dataframe自己的fillna方法丽已,可以用訓練好的模型來插補其他值,所以要看具體的需求买决。如果fillna可以解決那就更方便沛婴。
- 單變量插補
from sklearn import preprocessing
imp = preprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0) #設定缺失值的識別、填補方法
imp.fit_transform(X) #用X來訓練督赤,同時插補X
imp.transform(X1) #用訓練好的模型來插補X1
- 多變量插補
使用其他列的情況來插補自己列嘁灯,暫時也用不到
5.5 無監(jiān)督降維
PCA和非負矩陣因式分解NNF都可以降維,都在第二章無監(jiān)督學習的機器學習模型中再介紹躲舌。
5.8 距離丑婿、相似度以及核函數(shù)
tips:距離和相似度計算肯定是按行向量算的哈
- 距離計算
距離的定義也有幾種,可以在參數(shù)進行設置没卸,如果不設置那就是平方距離
from sklearn import metrics
metrics.pairwise_distances(X, Y)
- 相似度
余弦相似度
from sklearn import metrics
metrics.pairwise.cosine_similarity(X, Y)
jaccard相似度在sklearn.metrics.jaccard_similarity_score 里面
-
核函數(shù)
這里不是對單一的X進行變換羹奉,而是對X和Y進行聯(lián)合變換。具體要看公式约计,比如線性變換:
image.png
from sklearn import metrics
metrics.pairwise.linear_kernel(X, Y) #線性核函數(shù)
metrics.pairwise.polynomial_kernel(X, Y) #多項式核函數(shù)
metrics.pairwise.sigmoid_kernel(X, Y) #sigmoid核函數(shù)
metrics.pairwise.rbf_kernel(X, Y) #RBF核函數(shù)
metrics.pairwise.laplacian_kernel(X, Y) #拉普拉斯核函數(shù)
metrics.pairwise.chi2_kernel(X, Y) #卡方核函數(shù)
5.9 預測目標Y的轉換
同樣提供了二值化和編碼的方法诀拭,但是這里要求只能輸入series而不是多維的dataframe,所以更多是讓你養(yǎng)成習慣煤蚌,對特征進行編碼就用OrdinalEncoder()耕挨,對標簽進行編碼就用LabelEncoder()
from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
lb.fit(Y)
le = preprocessing.LabelEncoder()
le.fit(Y)
1.13 特征選擇(篩除列)
- 移除低方差特征
from sklearn import feature_selection
sel = feature_selection.VarianceThreshold(threshold=0.25) #方差閾值設置
sel.fit_transform(X)
- 單變量特征選擇
SelectKBest :移除那些除了評分最高的 K 個特征之外的所有特征
SelectPercentile :移除除了用戶指定的最高得分百分比之外的所有特征
from sklearn import feature_selection
sel= feature_selection.SelectKBest(feature_selection.chi2, k=2) #用卡方分布來對樣本集進行評分,并選擇最好的兩個
sel.fit_transform(X, y) #卡方校驗是需要y值的
這里講一下卡方分布校驗某項特征是否會影響分類情況:
假設某項特征與分類無關的話尉桩,對其進行區(qū)間離散筒占,每個區(qū)間的分類數(shù)目應當是等分的,那么與實際分類數(shù)目的殘差的平方(基本上校驗都是對殘差校驗)是符合標準正態(tài)分布的蜘犁,所以各個區(qū)間的殘差之和是服從卡方分布的翰苫。函數(shù)會返回一個卡方值以及對應的p值,p值對應的是α顯著性水平沽瘦,如果過高的話則會被拒絕(α=1-置信度革骨,這里希望α值越小越好农尖,因為只用很小的置信度就可以滿足)。這里我們是希望卡方越大越好良哲,所需要的置信度就越高盛卡,p值則越小,因此可以拒絕H0筑凫,即認為該特征與分類有關滑沧。所以最后是保留卡方值很大的幾項特征,對應的p很小巍实。
p值滓技、校驗數(shù)值(卡方值)、H0假設真的要對應起來看棚潦,不過一般情況下做的H0假設都是我們希望拒絕的假設令漂,這下的話P很小的話,我們就可以拒絕H0丸边,從而找到符合自己的期望的結論叠必。
from sklearn import feature_selection
feature_selection.chi2(X,y)#會返回卡方值以及對應的p
這里給了一個參考,不過就我個人而言妹窖,卡方值做特征值篩選是非常合理的纬朝,而其他做分類和回歸校驗好像沒有特別合理的地方。
- 使用 SelectFromModel 選取特征
SelectFromModel 也是外包的一個元轉換器骄呼,可以用來處理任何帶有 coef_ 或者 feature_importances_ 屬性的訓練之后的評估器共苛。
from sklearn import feature_selection
sel=feature_selection.SelectFromModel() #設置參考的模型,以及設置從coef_選擇還是通過閾值(評分)從feature_importances_中選擇
一般是從決策樹中進行feature_importances_選擇蜓萄;或者其他模型結合L1正則項(L1會逼近系數(shù)為0)進行coef_選擇隅茎。
2、模型
1.1 線性模型
- 普通最小二乘法
from sklearn import linear_model
reg = linear_model.LinearRegression()
reg.fit (X,Y)
reg.coef_ #非常數(shù)項系數(shù)
reg.intercept_ #常數(shù)項
reg.predict(X_predict) #預測
-
嶺回歸
image.png
對非常數(shù)項系數(shù)做L2正則化绕德,嶺系數(shù)最小化的是帶罰項的殘差平方和患膛。
from sklearn import linear_model
reg = linear_model.Ridge (alpha = .5) #設置懲罰系數(shù)
reg.fit (X,Y)
reg.coef_ #非常數(shù)項系數(shù)
reg.intercept_ #常數(shù)項
reg.predict(X_predict) #預測
-
Lasso回歸
image.png
L1正則項(前面的2n應該不用管,因為實際上只是控制α的懲罰大谐苌摺)
由于 Lasso 回歸產(chǎn)生稀疏模型,因此可以用于執(zhí)行特征選擇
from sklearn import linear_model
reg = linear_model.Lasso (alpha = .5) #設置懲罰系數(shù)
reg.fit (X,Y)
reg.coef_ #非常數(shù)項系數(shù)
reg.intercept_ #常數(shù)項
reg.predict(X_predict) #預測
-
彈性網(wǎng)絡
image.png
L1+L2胞此,通過參數(shù)控制兩者比例大小臣咖,模型不管
-
貝葉斯回歸
在引入了L1和L2后,懲罰項的參數(shù)通常是人工設定或者參數(shù)尋優(yōu)找到的漱牵,貝葉斯回歸則是通過概率尋優(yōu)得到的夺蛇。(里面肯定是做了假設的,比如輸出y服從什么分布之類的)酣胀,模型不管
image.png 邏輯回歸
from sklearn import linear_model
LR = linear_model.LogisticRegression (penalty='l2',C=1.0) #默認是L2正則項
LR.fit (X,Y)
LR.coef_ #非常數(shù)項系數(shù)
LR.intercept_ #常數(shù)項
LR.predict(X_predict) #預測
LR.predict_proba(X_predict) #預測屬于各個類的概率
LR.score(X,Y) #返回給定測試數(shù)據(jù)和標簽上的平均準確度
邏輯回歸因為是分類問題刁赦,所以有predict_proba的方法娶聘。
有一個細則是我現(xiàn)在學習的都是二分類的邏輯回歸,要么0甚脉,要么1丸升,而sigmoid函數(shù)也正好返回一個0~1的概率,所以如果是二分類問題牺氨,LR.predict_proba(X_predict) 會返回兩個值狡耻,一個是屬于0類的概率,一個是返回1類的概率猴凹,兩者之和必為1.
但實際上邏輯回歸是可以處理多分類問題的夷狰,比如有N個分類的話,會返回N個概率郊霎,和為1沼头。所以邏輯回歸如何處理多分類問題、sigmoid函數(shù)如何拓展书劝,還沒有研究瘫证。
1.4 支持向量機
from sklearn import svm
clf=svm.SVC() #其實有好幾種svm模型,svc就是最典型那種
clf.fit(X, Y)
clf.predict(X_predict) #預測
clf.predict_proba(X_predict) #預測屬于各個類的概率,得事先在模型中設置probability=True庄撮,不然向量機的模型概率意義不是很大
clf.score(X,Y) #返回給定測試數(shù)據(jù)和標簽上的平均準確度
clf.support_vectors_ #獲得支持向量
clf.support_ #獲得支持向量的索引
clf.n_support_ #每一個類別的支持向量的數(shù)量
clf.dual_coef_ #支持向量的系數(shù)
SVC和NuSVC提供多元分類方式背捌,具體可以看參數(shù),本質(zhì)上是“one-against-one”的模型訓練洞斯,提供了多個分類器毡庆。
向量機也可以用于回歸,理論上只要只是最開始的推導公式的不同烙如,或者說把所有的值都歸一化到0~1之間再進行分類么抗,轉化為為分類問題也是進行回歸的一種方法(LR的理論。亚铁。)蝇刀。具體細則沒有多做研究。典型的回歸模型是SVR徘溢。
from sklearn import svm
clf=svm.SVR() #選擇核函數(shù)應該蠻關鍵的了吞琐,因為是做回歸而不是分類
clf.fit(X,Y)
clf.predict(X_predict)
1.5 KNN
KNN尋找數(shù)據(jù)有兩種思想,一種是K的數(shù)目限制然爆,一種是radius半徑限制站粟。
from sklearn import neighbors
nbrs = neighbors.NearestNeighbors() #有兩種KNN思想,一種是K的數(shù)目限制曾雕,一種是radius半徑限制奴烙;參數(shù)里面可以設置距離的計算方法,與sklearn.meric里面的方法都可以用
nbrs.fit(X)
distances, indices = nbrs.kneighbors (X) #這里是用k數(shù)目,實際只返回K-1個值切诀,因為會返回自己揩环,占第一個位置
distances #返回距離 ,自己與自己的距離是0
indices #返回序號幅虑,第一項是自己的序號
distances, indices = nbrs.radius_neighbors (X) #這里是半徑
distances
indices
nbrs.kneighbors_graph(X).toarray() #生成洗漱矩陣丰滑,是k鄰近范圍內(nèi)為1,不在則為0
KNN分類的話翘单,比聚類還簡單粗暴吨枉,聚類是要不斷更新質(zhì)心的,而KNN是按照K鄰近的分類結果進行投票哄芜,歸為多數(shù)類貌亭,很直接簡單。但KNN分類本質(zhì)上是監(jiān)督分類认臊,不同于聚類的無監(jiān)督圃庭。
from sklearn import neighbors
clf=neighbors.KNeighborsClassifier() #參數(shù)設置
clf.fit(X,Y)
clf.predict(X_predict)
KNN回歸的話,是根據(jù)K鄰近的值進行均值回歸.
from sklearn import neighbors
reg=neighbors. KNeighborsRegressor() #參數(shù)設置
reg.fit(X,Y)
reg.predict(X_predict)
1.9 樸素貝葉斯
相比于其他更復雜的方法失晴,樸素貝葉斯學習器和分類器非尘缒澹快。 而且在文檔分類和垃圾郵件過濾等方面的效果都不錯(取決于實際場景是否適用)涂屁。但是书在,盡管樸素貝葉斯被認為是一種相當不錯的分類器,但卻不是好的估計器(estimator)拆又,所以不能太過于重視從 predict_proba 輸出的概率儒旬。(因為實際值可能都非常非常小,概率值和也不會為1)
-
高斯樸素貝葉斯:
image.png
所以如果對n維特征帖族,可以分為m類栈源,是有n*m個高斯參數(shù)的,因為是相互獨立進行估計的竖般。甚垦。
from sklearn import naive_bayes
clf= naive_bayes. GaussianNB() #參數(shù)設置
clf.fit(X,Y)
clf.predict(X_predict)
clf.predict_proba(X_predict)
-
多項分布樸素貝葉斯
image.png
這個就是典型的貝葉斯了,靠頻率計數(shù)來估計涣雕。艰亮。
from sklearn import naive_bayes
clf= naive_bayes. MultinomialNB() #參數(shù)設置
clf.fit(X,Y)
clf.predict(X_predict)
clf.predict_proba(X_predict)
1.10 決策樹
決策樹典型的集中方法ID3、C4.5胞谭、CART垃杖,scikit-learn 使用 CART 算法的優(yōu)化版本。
ID3:熵的信息增益
C4.5:熵的信息增益率
CART:基尼指數(shù)來劃分
- 決策樹分類
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
clf.predict(X_predict)
clf.predict_proba(X_predict) #返回的是屬于各個類的概率丈屹,應該是根節(jié)點上面三個類的樣本的數(shù)目占比
- 決策樹可視化
進一步,采用graphviz進行決策樹可視化。
import graphviz
dot_data = tree.export_graphviz(clf) #graphviz是識別dot_data數(shù)據(jù)類型旺垒,這里的dot_data可以用out_file參數(shù)導出
graph = graphviz.Source(dot_data) #形成圖像
graph
上面的value是什么意思彩库?是分屬于幾個類的樣本數(shù)目!O冉骇钦!
export_graphviz 還支持各種美化,包括通過他們的類著色節(jié)點(或回歸值)竞漾,如果需要眯搭,還能使用顯式變量和類名。具體可以看模塊說明业岁。
- 決策樹回歸
決策樹分類是以熵鳞仙、基尼系數(shù)等來作為樹決策的,決策樹回歸是以均方誤差mse(也可以選其他的標準)來作為樹決策的笔时,在設定的最大樹深度棍好、葉節(jié)點所需最小樣本數(shù)、拆分內(nèi)部節(jié)點所需最小樣本數(shù)等參數(shù)的限制下(所以對參數(shù)選擇應該很敏感)允耿,最終展開為決策回歸樹借笙。所以最后應該是有多少根節(jié)點就有多少個回歸值(為其樣本均值)。
from sklearn import tree
reg= tree.DecisionTreeRegressor()
reg= reg.fit(X, Y)
reg.predict(X_predict)
- 多輸出決策樹
可以構建多個決策樹较锡,每個決策樹有一個輸出业稼,也可以直接構建多輸出決策樹,本質(zhì)上和單決策樹也沒區(qū)別蚂蕴。低散。
1.11 集合方法
- bagging-元估計器
元估計器可以實現(xiàn)用任意clf或者reg模型來組合,只需要人工設定基模型類型掂墓、基模型數(shù)目谦纱、基模型樣本量、基模型特征量君编、基模型有無放回抽樣等等
from sklearn import ensemble
from sklearn import neighbors
bagging = ensemble.BaggingClassifier(neighbors.KNeighborsClassifier(),max_samples=0.5, max_features=0.5)
- bagging-隨機森林
from sklearn import ensemble
clf = ensemble.RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)
當然也可以用RandomForestRegressor做隨機森林回歸跨嘉。
有幾個參數(shù):
n_estimators:理論上是越多越好,但當樹的數(shù)量超過一個臨界值之后吃嘿,算法的效果并不會很顯著地變好祠乃。
max_features:隨機選擇的特征數(shù)目,根據(jù)經(jīng)驗兑燥,回歸問題中使用 max_features = None (總是考慮所有的特征)亮瓷, 分類問題使用 max_features = "sqrt" (隨機考慮 sqrt(n_features) 特征,其中 n_features 是特征的個數(shù))是比較好的默認值降瞳。
max_depth = None 和 min_samples_split = 2結合通常會有不錯的效果(即生成完全的樹)嘱支。
n_jobs = k:并行化提升速度蚓胸。
feature_importances_:這是屬性(不是參數(shù)),表征各個特征的重要性除师,總和為1沛膳。重要性的計算依據(jù)?一是頂部特征肯定最重要(純度減少更多)汛聚;二是在森林中的使用次數(shù)越多說明越重要锹安。所以sklearn是將兩者進行結合計算的。具體算法沒有詳說倚舀,反正參照的是別人的論文叹哭。
- boosting- adaboost
from sklearn import ensemble
clf=ensemble.AdaBoostClassifier(n_estimators=100)
clf = clf.fit(X, Y)
參數(shù)說明:
n_estimators:控制弱學習器的數(shù)量(boosting也是多個學習器),相當于迭代次數(shù)
learning_rate:學習率/貢獻率痕貌,需要和n_estimators配合使用风罩。我找了一下,adaboost的貢獻率α是嚴格推導出來的最優(yōu)值芯侥,但可以更改的地方在于向前分布算法只是一種求解原復雜問題的替代方案泊交,所以通過比率縮放貢獻率的話,可以推動用更多弱學習器來進行擬合柱查。
base_estimator:弱學習器的類型(可以不是決策樹)廓俭,還可以進一步設置弱學習器的max_depth等等(所以也不是弱學習器只有一個決策分支)。唉工。研乒。
- Gradient Tree Boosting(梯度樹提升)
from sklearn import ensemble
clf=ensemble.GradientBoostingClassifier(n_estimators=100)
clf = clf.fit(X, Y)
也可以做回歸(都可以做回歸。淋硝。)
from sklearn import ensemble
reg=ensemble.GradientBoostingRegressor(n_estimators=100)
reg= reg.fit(X, Y)
有幾個重要參數(shù):
loss:設定損失函數(shù)雹熬。(adaboost是指數(shù)損失函數(shù),不能更改的)
clf.train_score_:屬性谣膳,返回每一次迭代的訓練誤差
clf.staged_predict():方法竿报,返回的是一個生成器,用來產(chǎn)生每一 個迭代的預測結果继谚,所以得用生成器的方式來取數(shù)(i,y_pred)烈菌。如果要返回每一次預測的誤差,需要配合clf.loss_來計算一下花履,具體可以參見案例:
https://scikit-learn.org/stable/auto_examples/ensemble/plot_gradient_boosting_regression.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-regression-py
- 投票器
投票器是再用一層包裝(就像bagging的元估計器)芽世,對多個不同的機器學習分類器的結果進行投票。
分類:
from sklearn import ensemble
clf1=...
clf2=...
clf3=...
eclf = ensemble.VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='hard')
投票方式又可以分為硬投票诡壁、軟投票济瓢;
投票也可以用來回歸辞槐;
詳情可以看案例坡贺。
1.12 多類和多標簽算法
sklearn.multiclass模塊采用了 元評估器 毕莱,通過把多類 和 多標簽 分類問題分解為 二元分類問題去解決逗概。這同樣適用于多目標回歸問題。
但是本身很多分類器本身就提就是多類分類器宠漩,可以查看其是否為多分類器举反、屬于哪一類多分類器懊直“怯酰總的可以分為:
- 固有的多類分類器:比如sklearn.neighbors.KNeighborsClassifier返回的是一個矩陣,值分別為分屬于N個類的概率室囊,概率之和為1雕崩。
- 1對1的多類分類器:只有兩類,且最后只輸出屬于哪一類
- 1對多的多累分類器:有多類融撞,且最后只輸出屬于哪一類
- 支持多標簽分類的分類器:可以多屬于多個標簽里面盼铁。
- 多輸出分類:輸出多個值。
1.17 神經(jīng)網(wǎng)絡
- 多層感知器
from sklearn import neural_network
clf=neural_network.MLPClassifier(hidden_layer_sizes=(5,3,2),activation='logistic',solver='sgd',learning_rate_init=0.5,shuffle =True) # MLP的話只能設置隱藏層的激活函數(shù)尝偎,不存在輸出層的函數(shù)饶火;采用交叉熵函數(shù)為損失函數(shù),不能自定義損失函數(shù)
clf.fit(X, y)
clf.predict(X_predict)
clf.predict_proba(X_predict)
clf.coefs_ #系數(shù)矩陣
ps致扯,sgd隨機梯度下降就是每次在眾多樣本中只隨機選擇一個樣本的梯度作為全局梯度迭代肤寝,所以需要配合shuffle設置為True保證每次選擇樣本的時候會混洗;除了隨機梯度也有批量梯度迭代(全局梯度迭代)和小批量梯度迭代抖僵。
也可以用MLPRegressor做回歸鲤看,但是局限比較大(MLP分類的局限性都比較大了,畢竟不允許輸出層激活函數(shù)和損失函數(shù)的設置)耍群,采用恒等函數(shù)做為激活函數(shù)义桂、平方誤差作為損失函數(shù),不能自行設置蹈垢。
2.3 聚類
- kmeans
距離計算方式為平方距離慷吊,不能更改
from sklearn import cluster
clf=cluster.KMeans(n_clusters=2, random_state=0) #k數(shù)目、迭代次數(shù)曹抬、迭代最小值等溉瓶;距離方式為平方距離,不能更改
kmeans=clf.fit(X)
kmeans=clf.predict(X_predict)
kmeans.labels_ #返回樣本所屬簇標簽
kmeans.cluster_centers_ #返回簇質(zhì)心
- 層次聚類
層次聚類需要設定最終的樹的數(shù)目沐祷;樹間的距離計算方式一般采用ward(平方差總和)方式
from sklearn import cluster
clf=cluster.AgglomerativeClustering(n_clusters=2) #最終樹的數(shù)目嚷闭、affinity距離方式、linkage樹內(nèi)的距離計算方式ward赖临、complete等
kmeans=clf.fit(X)
kmeans.labels_ #返回樣本所屬簇標簽
用scipy進行層次聚類的可視化胞锰,scipy實現(xiàn)層次聚類的可視化都是計算+可視化一體的,所以無法先用sklearn計算兢榨,再用scipy可視化嗅榕。顺饮。。
https://blog.csdn.net/fengchi863/article/details/80537733
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
X=np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])
Z = linkage(X, 'ward','euclidean') #linkage是層次聚類函數(shù)凌那,
plt.figure()
dn = dendrogram(Z)
可以和sklearn的聚類結果對比,前三項被聚為一類兼雄、后三項被聚為一類,所以是一致的C钡:
- 其他聚類
譜聚類赦肋、密度聚類等等,提供了相當多的包励稳,但是最常用的可能還是k聚類和層次聚類 - 聚類性能度量
python提供了的聚類度量主要是監(jiān)督性的聚類度量(已知正確分類結果)佃乘,蘭德指數(shù)、互信息等驹尼。趣避。。
2.5成分分解
- PCA
https://blog.csdn.net/program_developer/article/details/80632779
PCA可以通過特征值分解EVD和奇異值分解SVD兩種方案實現(xiàn)新翎,EVD的步驟是:1)去平均值(即去中心化)程帕,即每一位特征減去各自的平均值。2) 計算協(xié)方差矩陣地啰。3) 用特征值分解方法求協(xié)方差矩陣的特征值與特征向量愁拭。4) 對特征值從大到小排序,選擇其中最大的k個髓绽。然后將其對應的k個特征向量分別作為行向量組成特征向量矩陣P敛苇。5) 將數(shù)據(jù)轉換到k個特征向量構建的新空間中,即Y=PX顺呕。
import numpy as np
from sklearn import decomposition
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca =decomposition.PCA(n_components=2) #設定降維數(shù) ,也可以用小數(shù)點設置降維后達到的方差量為多少
pca.fit_transform(X)
pca.get_covariance() #協(xié)方差矩陣
pca.components_ #n個維度的映射關系枫攀,是以行排列的
pca.explained_variance_ratio_ #n個維度的方差百分比
np.dot(X,pca.components_.T) #這個等價于pca.fit_transform(X) ,就是轉換關系V瓴琛来涨!
核PCA
上述是線性的PCA,sklearn也提供核PCA启盛,不做多研究蹦掐。非負矩陣因式分解NNF
from sklearn import decomposition
X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
nmf = NMF(n_components=2) #設置特征數(shù)目
W = nmf.fit_transform(X) #權重矩陣
H = nmf.components_ #特征矩陣
np.dot(W,H) #X=WH
與X值是相等的。
三僵闯、模型選擇和評估
3.1 交叉驗證
- 訓練集測試集分割
from sklearn import model_selection
from sklearn import datasets
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = model_selection.train_test_split(iris.data, iris.target, train_size=0.4, random_state=0)
clf=svm.SVC().fit(X_train,y_train)
clf.score(X_test, y_test)
- 模型交叉驗證CV
from sklearn import model_selection
clf = svm.SVC(kernel='linear', C=1)
scores =model_selection.cross_val_score(clf, iris.data, iris.target, cv=10) #cv設置為整數(shù)則為采用K折法
scores.mean() #得到n此交叉驗證的模型平均精度
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2)) #置信度表示
cross_val_score只返回測試得分卧抗,cross_validate 可以返回多個指標,如果不進行設置的化鳖粟,會返回訓練得分社裆、擬合次數(shù)、得分次數(shù)(time是時間還是次數(shù)表示懷疑向图?這里可能表示用于模型訓練和測試的時間)的字典泳秀。一般不會用到cross_validate标沪。
- 交叉驗證迭代器K-Fold
from sklearn import model_selection
X = ["a", "b", "c", "d"] #X是什么不重要,它只是需要計算下X的長度
kf = model_selection.KFold(n_splits=4) #設置K折數(shù)目
for train, test in kf.split(X):
print("%s %s" % (train, test))
可以看到嗜傅,KFold是一個迭代器金句,而且返回的是原始數(shù)據(jù)的序號,如果要取數(shù)據(jù)的話吕嘀,需要用序號再取违寞。
RepeatedKFold可以設置參數(shù)從而重復K-Fold n次。币他。
LeaveOneOut和LeavePOut是留一法和留P法坞靶,不過可以也可以設置KFold中n_splits=X.shape[1]來實現(xiàn)。
- 基于類標簽蝴悉、具有分層的交叉驗證迭代器
用于解決樣本不平衡問題,理想情況是希望篩選的樣本在各個類別中的比例保持原樣瘾敢。(如果是希望各類樣本的數(shù)目一致的話不能用這個模型選)
from sklearn import model_selection
X = np.ones(10) #X是什么不重要拍冠,它只是需要計算下X的長度
y = [0, 0, 1, 1, 1, 1, 1, 1, 1, 1] #y是什么很重要,它需要計算原始分層比例
skf = model_selection.StratifiedKFold(n_splits=3)
for train, test in skf.split(X, y):
print("%s %s" % (train, test))
結果可以看出簇抵,原始的分層比例被保留庆杜,這里對比一下用KFOLD來選擇的結果:
- 組k-fold
組k-fold的核心思想是希望用盡少可能的組做訓練,然后測試集中的組都是新的碟摆,這樣可以檢測新來源的樣本(新的組)晃财,是否適用于該模型。
from sklearn import model_selection
X = [0.1, 0.2, 2.2, 2.4, 2.3, 4.55, 5.8, 8.8, 9, 10]
#X不重要
y = ["a", "b", "b", "b", "c", "c", "c", "d", "d", "d"]
#y是可選典蜕,看你自己認為需不需要
groups = [1, 1, 1, 2, 2, 2, 3, 3, 3, 3]
#groups很重要断盛,他需要知道標簽
gkf = model_selection.GroupKFold(n_splits=3)
for train, test in gkf.split(X,y, groups=groups):
... print("%s %s" % (train, test))
這里的y是可選,我認為是如果沒有y的話愉舔,就按照groups最優(yōu)切割進行切割钢猛,如果有考慮y的話,則要進一步考慮對y的分層切割轩缤。命迈。
相對應的,還有留一組和留P組的分割火的,不過都用不著壶愤。。馏鹤。
ps:為了避免原始數(shù)據(jù)中心數(shù)據(jù)的順序是有一定規(guī)則的(例如征椒,相同標簽的數(shù)據(jù)連續(xù)出現(xiàn)),一般情況是設置參數(shù)shuffle=True進行原始數(shù)據(jù)打散假瞬,再進行切割的陕靠。
3.2 超參數(shù)估計
https://www.cnblogs.com/nolonely/p/7007961.html
學習器模型中一般有兩個參數(shù):一類參數(shù)可以從數(shù)據(jù)中學習估計得到迂尝,還有一類參數(shù)無法從數(shù)據(jù)中估計,只能靠人的經(jīng)驗進行指定剪芥,后一類參數(shù)就叫超參數(shù)垄开。
sklearn 提供了兩種通用的參數(shù)優(yōu)化方法:
a) 網(wǎng)格搜索交叉驗證(GridSearchCV):以窮舉的方式遍歷所有可能的參數(shù)組合;
b) 隨機采樣交叉驗證(RandomizedSearchCV):依據(jù)某種分布對參數(shù)空間采樣税肪,隨機的得到一些候選參數(shù)組合方案(相當于已知概率曲線溉躲,然后按概率取值)。
在此之外益兄,還有貝葉斯優(yōu)化锻梳,也是對超參數(shù)的的一種優(yōu)化。個人感覺是通過先驗概率來不斷優(yōu)化假定的概率函數(shù)的參數(shù)净捅,并進一步進行概率篩選疑枯,相當于比隨機采樣還多了一步概率函數(shù)的參數(shù)優(yōu)化(以后有機會再研究)。
from sklearn import model_selection
from sklearn import metrics
from sklearn.svm import SVC #設定模型
# 超參數(shù)設定格式是含多個字典的list
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],'C': [1, 10, 100, 1000]},
{'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]
#尋優(yōu)目標
scores = ['precision', 'recall']
for score in scores:
print("# Tuning hyper-parameters for %s" % score)
clf = model_selection.GridSearchCV(SVC(), tuned_parameters,scoring='%s_macro' % score)
#網(wǎng)格搜索的格式;琢荆永!cv是k折法,不屬于超參數(shù)
clf.fit(X_train, y_train)
print("Best parameters set found on development set:")
print()
print(clf.best_params_)
print()
print("Grid scores on development set:")
print()
means = clf.cv_results_['mean_test_score'] #網(wǎng)格搜索后所帶有的屬性
stds = clf.cv_results_['std_test_score'] #網(wǎng)格搜索后所帶有的屬性国章,就這兩者用的比較多吧
for mean, std, params in zip(means, stds, clf.cv_results_['params']):
print("%0.3f (+/-%0.03f) for %r"
% (mean, std * 2, params)) #兩倍標準差設置
print()
print("Detailed classification report:")
print()
y_true, y_pred = y_test, clf.predict(X_test)
print(metrics.classification_report(y_true, y_pred))
#metrics帶有的報告模塊具钥。要用打印格式才不會亂碼;這里返回結果有9組液兽,是因為有9種label
print()
隨機采樣可以查看文檔骂删。。
3.3 模型評估
- 常見分類評估指標
召回率recall,TP/(TP+FN):
metrics.recall_score()
精度precision,TP/(TP+FP):
metrics.precision_score()
準確性accuracy,(TP+TN)/(TP+TN+FP+FN):
metrics.accuracy_score()
f1,2PrecisionRecall)/(Precision+Recall):
metrics.f1_score() #實際上還有微觀f1四啰、宏觀f1宁玫、權重f1等方式
roc_auc:
metrics.roc_auc_score #這個有點問題,之后再看
metrics.auc(fpr, tpr) #上面那個有問題拟逮,可以用下面這個計算auc面積撬统,fpr和tpr是數(shù)組,對應不同閾值時的值
- 常見回歸評估指標
https://blog.csdn.net/Softdiamonds/article/details/80061191
絕對值誤差:metrics.mean_absolute_error
均方誤差:metrics.mean_squared_error
決定系數(shù)(擬合優(yōu)度)r2:metrics.r2_score
模型越好:r2→1
模型越差:r2→0
- 混淆矩陣
y_true = [0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 1, 0, 1, 0, 1, 0, 1]
tn, fp, fn, tp=confusion_matrix(y_true, y_pred).ravel() #展開數(shù)組敦迄,得到的是tn, fp, fn, tp
-
分類報告
image.png
3.4 模型持久化
使用pickle模塊恋追,或者joblib模塊
from sklearn.externals import joblib
joblib.dump(clf, 'filename.pkl') #保存模型
clf = joblib.load('filename.pkl') #加載模型
3.5 驗證曲線和學習曲線
核心概念是偏差-方差困境:如果模型過于簡單,會有很大的偏差(也就是模型誤差)罚屋,如果模型過于復雜苦囱,很有可能是用很復雜的模型進行過擬合,這時候雖然在驗證集上有很好的效果脾猛,但是在測試集撕彤、或者是新數(shù)據(jù)上效果不好,即不能很好地擬合真實的函數(shù),即對訓練數(shù)據(jù)的變化(高方差)非常敏感羹铅。一般解決的辦法就是盡量找到合適的參數(shù)避免過擬合和欠擬合(驗證曲線)蚀狰、以及利用合適的樣本數(shù)目保證模型訓練擬合度(學習曲線)。詳細可以參見文檔职员。