我與資料科學 - [Today is sklearn] - [sklearn api]
分割資料將資料分為訓練集和測試集,使用sklearn的model_selection庫裡面的 train_test_split
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=1)
決策樹分類器,使用sklearn的tree庫裡面的DecisionTreeClassifier
model = DecisionTreeClassifier(criterion='entropy', max_depth=6)
原函式:
sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2,min_samples_leaf =1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None,class_weight=None, presort=False)
criterion:衡量分類的質量,預設為"gini",支援的標準有"gini",代表的是gini impurity(不純度)與"entropy",代表的是information gain(資訊增益)
splitter:一種用來在選節點中選擇分類的策略,預設為"best",代表選擇最好的分類,"random"代表選擇最好的隨機分類
max_features:分類時最大特徵數目,預設None表示最大特徵數目等於樣本特徵數目
max_depth:表示樹的最大深度,預設為None表示會一直分類到所有節點都是純節點或者滿足min_sample_leaf,忽視max_leaf_nodes是不是等於None
min_samples_split:區分一個內部節點所需要的最小樣本數,預設為2
min_weight_fraction_leaf:一個葉節點的輸入樣本所需要的最小加權分數
max_leaf_nodes:如果是None則對葉節點的數目沒有限制。如果不是None則不考慮max_depth.
隨機森林分類器,使用sklearn裡面ensemble庫裡面的RandomForestClassifer
clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=3)
函式原型:
sklearn.ensemble.RandomForestClassifier(n_estimators=10, crite-rion=’gini’, max_depth=None,
min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_features=’auto’,
max_leaf_nodes=None, bootstrap=True,
oob_score=False, n_jobs=1, ran-dom_state=None, verbose=0,
warm_start=False, class_weight=None)
verbose:(default=0) 是否顯示任務程序
n_estimators=10:決策樹的個數,越多越好,但是效能就會越差,至少100左右(具體數字忘記從哪裡來的了)可以達到可接受的效能和誤差率。
bootstrap=True:是否有放回的取樣
oob_score=False:oob(out of band,帶外)資料,即:在某次決策樹訓練中沒有被bootstrap選中的資料。多單個模型的引數訓練,我們知道可以用cross validation(cv)來進行,但是特別消耗時間,而且對於隨機森林這種情況也沒有大的必要,所以就用這個資料對決策樹模型進行驗證,算是一個簡單的交叉驗證。效能消耗小,但是效果不錯。
n_jobs=1:並行job個數。這個在ensemble演算法中非常重要,尤其是bagging(而非boosting,因為boosting的每次迭代之間有影響,所以很難進行並行化),因為可以並行從而提高效能。1=不併行;n:n個並行;-1:CPU有多少core,就啟動多少job
warm_start=False:熱啟動,決定是否使用上次呼叫該類的結果然後增加新的。
class_weight=None:各個label的權重。
bagging分類器,使用sklearn裡面ensemble庫中的BaggingRegressor
從樣本集中重取樣(有重複的)選出n個樣本,在所有屬性上,對這n個樣本建立分類器(ID3,ID4.5, CART,SVM)等等
重複建立m個分類器,將資料放在這m個分類器上,最後根據這m個分類器的選擇,決定資料屬於哪一分類。
決策樹是一個可讀性很強、分類快,同時不需要對資料進行歸一化還有縮放的處理。但是決策樹有個不足的地方就是非常容易過
擬合,所以必須要採取一些方法進行剪枝。而bagging方法的出現,可以完美地解決了決策樹過擬合的問題,同時bagging的使用
也會使分類器分類效果得到了顯著的提高
bagging_ridged = BaggingRegressor(ridged, n_estimators=100, max_samples=0.3)
函式原型
sklearn.ensemble.BaggingRegressor(base_estimator=None, n_estimators=10, max_samples=1.0, max_features=1.0, bootstrap=True, bootstrap_features=False, oob_score=False, warm_start=False, n_jobs=None, random_state=None, verbose=0)
base_estimator:Object or None。None代表預設是DecisionTree,Object可以指定基估計器(base estimator)。
n_estimators:int, optional (default=10) 。 要整合的基估計器的個數。
max_samples: int or float, optional (default=1.0)。決定從x_train抽取去訓練基估計器的樣本數量。int 代表抽取數量,float代表抽取比例
max_features : int or float, optional (default=1.0)。決定從x_train抽取去訓練基估計器的特徵數量。int 代表抽取數量,float代表抽取比例
bootstrap : boolean, optional (default=True) 決定樣本子集的抽樣方式(有放回和不放回)
bootstrap_features : boolean, optional (default=False)決定特徵子集的抽樣方式(有放回和不放回)
oob_score : bool 決定是否使用包外估計(out of bag estimate)泛化誤差
warm_start : bool, optional (default=False) true代表
n_jobs : int, optional (default=1) 意義同上個api
機器學習中的資料預處理,使用sklearn preprocessing
scale 零均值單位方差
from sklearn import preprocessing
import numpy as np
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
X_scaled = preprocessing.scale(X)
#output :X_scaled = [[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
#scaled之後的資料零均值,單位方差
X_scaled.mean(axis=0) # column mean: array([ 0., 0., 0.])
X_scaled.std(axis=0) #column standard deviation: array([ 1., 1., 1.])
處理過後的資料,在列上均值為0方差為1
StandardScaler計算訓練集的平均值和標準差,以便測試資料集使用相同的變換。
scaler = preprocessing.StandardScaler().fit(X) #out: StandardScaler(copy=True, with_mean=True, with_std=True)
scaler.mean_ #out: array([ 1., 0. , 0.33333333])
scaler.std_ #out: array([ 0.81649658, 0.81649658, 1.24721913])
#測試將該scaler用於輸入資料,變換之後得到的結果同上
scaler.transform(X) #out: array([[ 0., -1.22474487, 1.33630621], [ 1.22474487, 0. , -0.26726124], [-1.22474487,1.22474487, -1.06904497]])
scaler.transform([[-1., 1., 0.]]) #scale the new data, out: array([[-2.44948974, 1.22474487, -0.26726124]])
另外一種標準化方法是將資料縮放至給定的最小值與最大值之間,通常是0與1之間,可用MinMaxScaler實現。或者將最大的絕對值縮放至單位大小,可用MaxAbsScaler實現。
使用這種標準化方法的原因是,有時資料集的標準差非常非常小,有時資料中有很多很多零(稀疏資料)需要儲存住0元素。
MinMaxScaler(最小最大值標準化)
公式:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;
X_scaler = X_std/ (max - min) + min,其中max,min是指定的最大最小值,預設1,0
#例子:將資料縮放至[0, 1]間。訓練過程: fit_transform()
X_train = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
#out: array([[ 0.5 , 0. , 1. ],
[ 1. , 0.5 , 0.33333333],
[ 0. , 1. , 0. ]])
#將上述得到的scale引數應用至測試資料
X_test = np.array([[ -3., -1., 4.]])
X_test_minmax = min_max_scaler.transform(X_test) #out: array([[-1.5 , 0. , 1.66666667]])
#可以用以下方法檢視scaler的屬性
min_max_scaler.scale_ #out: array([ 0.5 , 0.5, 0.33...])
min_max_scaler.min_ #out: array([ 0., 0.5, 0.33...])
MaxAbsScaler(絕對值最大標準化)
與上述標準化方法相似,但是它通過每個特徵值除以該特徵最大值將訓練集縮放至[-1,1]。這意味著資料已經以0為中心或者是含有非常非常多0的稀疏資料
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(X_train)
# doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1., 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
X_test = np.array([[ -3., -1., 4.]])
X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. , 2. ]])
max_abs_scaler.scale_ #out: array([ 2., 1., 2.])
sklearn.pipeline 序列化
通過steps引數,設定資料處理流程。格式為('key','value'),key是自己為這一step設定的名稱,value是對應的處理類。最後通過list將這些step傳入。前n-1個step中的類都必須有transform函式,最後一步可有可無,一般最後一步為模型。pipe繼承了最後一個類的所有方法。
Pipeline(steps=[('pca', PCA(copy=True, iterated_power='auto', n_components=None,
random_state=None,
svd_solver='auto', tol=0.0, whiten=False)), ('svc', SVC(C=1.0, cache_size=200,
class_weight=None, coef0=0.0,
decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False))])
訓練得到的是一個模型,可直接用來預測,預測時,資料會從step1開始進行轉換,避免了模型用來預測的資料還要額外寫程式碼實現。還可通過pipe.score(X,Y)得到這個模型在X訓練集上的正確率。
make_pipeline函式是Pipeline類的簡單實現,只需傳入每個step的類例項即可,不需自己命名,自動將類的小寫設為該step的名。
In [50]: make_pipeline(StandardScaler(),GaussianNB())
Out[50]: Pipeline(steps=[('standardscaler', StandardScaler(copy=True, with_mean=
True, with_std=True)), ('gaussiannb', GaussianNB(priors=None))])
In [51]: p=make_pipeline(StandardScaler(),GaussianNB())
In [52]: p.steps
Out[52]:
[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True)),
('gaussiannb', GaussianNB(priors=None))]
同時可以通過set_params重新設定每個類裡邊需傳入的引數,設定方法為step的name__parma名=引數值
In [59]: p.set_params(standardscaler__with_mean=False)
Out[59]: Pipeline(steps=[('standardscaler', StandardScaler(copy=True, with_mean=
False, with_std=True)), ('gaussiannb', GaussianNB(priors=None))])
網格搜尋GridSearchCV,用於系統地遍歷多種引數組合,通過交叉驗證確定最佳效果引數。
原函式:
classsklearn.model_selection.GridSearchCV(estimator,param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True,cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score='raise',return_train_score=True)
estimator:
所使用的分類器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 並且傳入除需要確定最佳的引數之外的其他引數。每一個分類器都需要一個scoring引數,或者score方法。
scoring :
準確度評價標準,預設None,這時需要使用score函式;或者如scoring=’roc_auc’,根據所選模型不同,評價準則不同。字串(函式名),或是可呼叫物件,需要其函式簽名形如:scorer(estimator, X, y);如果是None,則使用estimator的誤差估計函式。
cv :
交叉驗證引數,預設None,使用三折交叉驗證。指定fold數量,預設為3,也可以是yield訓練/測試資料的生成器。
refit :
預設為True,程式將會以交叉驗證訓練集得到的最佳引數,重新對所有可用的訓練集與開發集進行,作為最終用於效能評估的最佳模型引數。即在搜尋引數結束後,用最佳引數結果再次fit一遍全部資料集。
iid:
預設True,為True時,預設為各個樣本fold概率分佈一致,誤差估計為所有樣本之和,而非各個fold的平均。
verbose:
日誌冗長度,int:冗長度,0:不輸出訓練過程,1:偶爾輸出,>1:對每個子模型都輸出。
n_jobs:
並行數,int:個數,-1:跟CPU核數一致, 1:預設值。
pre_dispatch:
指定總共分發的並行任務數。當n_jobs大於1時,資料將在每個執行點進行復制,這可能導致OOM,而設定pre_dispatch引數,則可以預先劃分總共的job數量,使資料最多被複制pre_dispatch次。
即便呼叫函式是param_grid已經填寫,也可以在後面,重新setparam
model = GridSearchCV(classification, param_grid={'alpha': alpha_can}, cv=5)
m = alpha_can.size
if hasattr(classification, 'alpha'):
model.set_params(param_grid={'alpha': alpha_can})
m = alpha_can.size
if hasattr(classification, 'n_neighbors'):
neighbors_can = np.arange(1, 15)
model.set_params(param_grid={'n_neighbors': neighbors_can})
m = neighbors_can.size
使用best_params獲取最優超引數
支援向量機api使用svm庫的svc函式
from sklearn import svm
clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')
clf.fit(x_train, y_train.ravel())
這裡kenel代表索要使用的核函式,rbf為徑向基函式,還有lin表示線性核
c代表的容錯率,c越大表示允許度越小,svm的緩衝區距離分割超平面越近。c特別小的時候容易造成過擬合。
gamma代表徑向基函式的類似彎曲程度,可以表示為負的方差分之一,gamma越大則方差越大,方差大的時候分割超平面近似於一條直線,方差小的時候,容易造成過擬合。
decision_function_shape有兩種ovo和ovr,主要是用於多分類問題,ovo代表多分類時採用一對一進行二分類,ovr代表採用1對剩下的所有進行二分類。
可以直接來檢視訓練模型的評分
clf.score(x_train, y_train)
可以檢視每個樣本對應各個類別的大小數值:
print('decision_function:\n', clf.decision_function(x_train))
decision_function:
[
[ 2.45540648 0.80337522 -0.2587817 ]
[-0.4368348 2.31950945 1.11732536]
[-0.43793789 1.00917055 2.42876733]
]
[0. 1. 2.]