机器学习实用代码汇总(你想要的这里都有)
機(jī)器學(xué)習(xí)實(shí)用代碼匯總(你想要的這里都有)
文章目錄
- 機(jī)器學(xué)習(xí)實(shí)用代碼匯總(你想要的這里都有)
- 前言
- 一、數(shù)據(jù)導(dǎo)入
- 1.數(shù)據(jù)文件讀取
- 2.提取特征和標(biāo)簽
- 3.數(shù)據(jù)分布及關(guān)系圖(ProfileReport)
- 二、數(shù)據(jù)預(yù)處理
- 1.數(shù)據(jù)的查看、去重、異常值刪除
- 2.數(shù)據(jù)的無量綱化
- 3.缺失值處理
- 4.處理分類型特征:編碼與啞變量
- 5.處理連續(xù)型特征:二值化與分段
- 6.數(shù)據(jù)集制造
- 7.樣本不均衡處理
- 8.訓(xùn)練集、測(cè)試集劃分
- 三、特征選擇
- 1.Filter過濾法
- 2.Embedded嵌入法
- 3. Wrapper包裝法
- 4.PCA與LDA降維
- 5.特征選擇經(jīng)驗(yàn)技巧
- 四、模型搭建及優(yōu)化
- 1.模型評(píng)估
- 1.1回歸模型評(píng)估(平均絕對(duì)誤差、平均方差、R平方值)
- 1.2分類模型評(píng)估(分類報(bào)告、混淆矩陣、ROC曲線、交叉驗(yàn)證)
- 1.3聚類模型評(píng)估(ARI、輪廓系數(shù))
- 2.機(jī)器學(xué)習(xí)常用回歸模型
- 2.1 線性回歸
- 2.2 決策樹回歸
- 2.3 支持向量機(jī)回歸
- 2.4 K近鄰回歸
- 2.5 隨機(jī)森林回歸
- 2.6 Adaboost 回歸
- 2.7 梯度增強(qiáng)隨機(jī)森林回歸
- 2.8 Bagging 回歸
- 2.9 ExtraTree 回歸
- 2.10 Xgboost回歸
- 3.機(jī)器學(xué)習(xí)常用分類模型
- 3.1 決策樹分類
- 3.2 隨機(jī)森林分類
- 3.3 Adaboost分類
- 3.4 GBDT分類
- 3.5 CatBoost分類
- 3.6 ExtraTress分類
- 3.7 KNN分類
- 3.8 SVM分類
- 3.9 XGBoost分類
- 3.10 樸素貝葉斯分類
- 3.11 LightGBM分類
- 3.12 融合模型分類
- 4.機(jī)器學(xué)習(xí)常用聚類模型
- 4.1 Kmeans,DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
- 四、參數(shù)調(diào)整
- 1.通用學(xué)習(xí)曲線
- 2.網(wǎng)格調(diào)參
- 3.隨機(jī)搜索
- 4.貝葉斯搜索
- 五、常用繪圖
- 六、參考文章
前言
這里記錄了自己在學(xué)習(xí)和實(shí)踐中, 記錄下來的常用代碼塊。非常適合小白來學(xué)習(xí)和實(shí)踐,在實(shí)踐過程中找到你想要的某些功能,不斷的復(fù)制粘貼就可以,有助于你早日成為CV工程師。
(后面會(huì)慢慢完善BP、CNN、RNN、LSTM、GRU、Transorformer、BERT、GAN、YOLOV、Q-learning、QMIX、MAPPO等網(wǎng)絡(luò)結(jié)構(gòu)結(jié)合任務(wù)場(chǎng)景的快速使用)
一、數(shù)據(jù)導(dǎo)入
1.數(shù)據(jù)文件讀取
代碼如下(示例):
#讀取CSV文件 import pandas as pd str="文件路徑"#您可以右鍵您的文件來復(fù)制路徑 data = pd.read_csv(str,header=None)#str:要打開的文件路徑,header=:布爾類型,等于None時(shí),可以自己給特征和標(biāo)簽取名字。names=:列表類型,傳入你想給特征和標(biāo)簽取的名字。 #讀取TXT文件 #按行讀取,放入列表即可 data = [] for line in open("文件路徑","r"): #設(shè)置文件對(duì)象并讀取每一行文件data.append(line) #將每一行文件加入到list中2.提取特征和標(biāo)簽
代碼如下(示例):
#X為你要取的特征,y為你要取的標(biāo)簽 X=data.iloc[a:b,m:n]#a,b為你要取a-1行到b-1行的數(shù)據(jù)。m,n為你要取第m-1列到n-1列的數(shù)據(jù)。 y=data.iloc[:,-1]#一般標(biāo)簽在最后一列3.數(shù)據(jù)分布及關(guān)系圖(ProfileReport)
用于數(shù)據(jù)分析報(bào)告,可以查看相關(guān)性,樣本分布關(guān)系等
代碼如下(示例):
import seaborn as sns import pandas as pd import pandas_profiling as pp import matplotlib.pyplot as plt data=pd.read_csv("data.csv") report = pp.ProfileReport(data) report二、數(shù)據(jù)預(yù)處理
1.數(shù)據(jù)的查看、去重、異常值刪除
代碼如下(示例):
#查看部分?jǐn)?shù)據(jù) print(data.head(m))#m為多少條數(shù)據(jù) #描述性統(tǒng)計(jì) print(data.describe([0.01,0.1,0.25,.5,.75,.9,.99]).T)#查看數(shù)據(jù)大致分布 #查看數(shù)據(jù)基本信息 print(data.info()) #查看數(shù)據(jù)數(shù)量統(tǒng)計(jì)信息 for cate in sample.columns:#sample為你導(dǎo)入的數(shù)據(jù)樣本print(sample[cate].value_counts()) #查看每個(gè)特征與標(biāo)簽的分布關(guān)系 m,n=sample.shape()#這里查看所有樣本和每一個(gè)特征,如果想查看個(gè)別特征修改循環(huán)值就行,想查看部分樣本,直接修改m。 for i in range(0,n-1):X_=np.arange(m)y_=pd.DataFrame(sample.iloc[0:m,i])z_=sample.iloc[0:m,0]plt.scatter(X_,y_,c=z_)plt.xlabel("sample")plt.ylabel("feature")plt.show()數(shù)據(jù)去重
#按某些列去重、raw_data為你的數(shù)據(jù)集 reviews=raw_data.copy() reviews=reviews[['content', 'content_type']]#選取你要去重的列 reviews=reviews.drop_duplicates()#數(shù)據(jù)整體去除重復(fù)值 data.drop_duplicates(inplace=True)#inplace=True表示替換原數(shù)據(jù) #刪除之后千萬不要忘記,恢復(fù)索引 data.index = range(data.shape[0])#按照索引為subset列去重 data=data.drop_duplicates(subset=1, ignore_index=True, inplace=True)箱線圖公式處理異常值:刪除需謹(jǐn)慎,除非是根據(jù)先驗(yàn)知道數(shù)據(jù)確實(shí)異常,否則隨意刪除很容易改變數(shù)據(jù)分布。并且只能對(duì)訓(xùn)練集刪除,測(cè)試集不能刪。
def outliers_proc(data, col_name, scale=1.5):"""用于清洗異常值,默認(rèn)用 box_plot(scale=1.5)進(jìn)行清洗(scale=1.5表示異常值,scale=3表示極端值):param scale: 尺度"""def box_plot_outliers(data_ser, box_scale):"""利用箱線圖去除異常值:param data_ser: 接收 pandas.Series 數(shù)據(jù)格式:param box_scale: 箱線圖尺度,:return:"""iqr = box_scale * (data_ser.quantile(0.75) - data_ser.quantile(0.25))val_low = data_ser.quantile(0.25) - iqrprint('val_low:',val_low)val_up = data_ser.quantile(0.75) + iqrprint('val_up:',val_up)rule_low = (data_ser < val_low) # 下離群點(diǎn)rule_up = (data_ser > val_up) # 上離群點(diǎn)return (rule_low, rule_up), (val_low, val_up)data_n = data.copy()data_series = data_n[col_name]rule, value = box_plot_outliers(data_series, box_scale=scale)index = np.arange(data_series.shape[0])[rule[0] | rule[1]]print("Delete number is: {}".format(len(index)))data_n = data_n.drop(index)data_n.reset_index(drop=True, inplace=True)print("Now row number is: {}".format(data_n.shape[0]))index_low = np.arange(data_series.shape[0])[rule[0]]outliers = data_series.iloc[index_low]print('\n',"Description of data less than the lower bound is:")print(pd.Series(outliers).describe())index_up = np.arange(data_series.shape[0])[rule[1]]outliers = data_series.iloc[index_up]print('\n',"Description of data larger than the upper bound is:")print(pd.Series(outliers).describe())fig, ax = plt.subplots(1, 2, figsize=(10, 7))sns.boxplot(y=data[col_name], data=data, palette="Set3", ax=ax[0])sns.boxplot(y=data_n[col_name], data=data_n, palette="Set3", ax=ax[1])return data_n2.數(shù)據(jù)的無量綱化
無量綱化可以幫我們提升模型精度,避免某一個(gè)取值范圍特別大的特征對(duì)距離計(jì)算造成影響。(一個(gè)特例是決策樹和樹的集成算法們,對(duì)決策樹我們不需要無量綱化,決策樹可以把任意數(shù)據(jù)都處理得很好。)
常用的數(shù)據(jù)無量綱化代碼有數(shù)據(jù)歸一化和數(shù)據(jù)標(biāo)準(zhǔn)化。大多數(shù)機(jī)器學(xué)習(xí)算法中,會(huì)選擇數(shù)據(jù)標(biāo)準(zhǔn)化來進(jìn)行特征縮放,因?yàn)閿?shù)據(jù)標(biāo)準(zhǔn)化對(duì)異常值非常敏感。在PCA,聚類,邏輯回歸,支持向量機(jī),神經(jīng)網(wǎng)絡(luò)這些算法中,數(shù)據(jù)標(biāo)準(zhǔn)化往往是最好的選擇。數(shù)據(jù)歸一化在不涉及距離度量、梯度、協(xié)方差計(jì)算以及數(shù)據(jù)需要被壓縮到特定區(qū)間時(shí)使用廣泛,比如數(shù)字圖像處理中量化像素強(qiáng)度時(shí),都會(huì)使用數(shù)據(jù)歸一化將數(shù)據(jù)壓縮于[0,1]區(qū)間之中。
代碼如下(示例):
數(shù)據(jù)歸一化
#數(shù)據(jù)歸一化 from sklearn.preprocessing import MinMaxScaler #實(shí)現(xiàn)歸一化 scaler = MinMaxScaler() #實(shí)例化 result = scaler.fit_transform(data) #訓(xùn)練和導(dǎo)出結(jié)果一步達(dá)成 data=scaler.inverse_transform(result) #將歸一化后的結(jié)果逆轉(zhuǎn)數(shù)據(jù)標(biāo)準(zhǔn)化
#數(shù)據(jù)標(biāo)準(zhǔn)化 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() #實(shí)例化 x_std =scaler.fit_transform(data) #訓(xùn)練和導(dǎo)出結(jié)果一步達(dá)成 data=scaler.inverse_transform(x_std) #使用標(biāo)準(zhǔn)化后的結(jié)果逆轉(zhuǎn)數(shù)據(jù)歸一化和標(biāo)準(zhǔn)化接口匯總
3.缺失值處理
代碼如下(示例):
用均值、中位數(shù)、特定值來填補(bǔ)缺失值
#常用的sklearn內(nèi)置填補(bǔ)缺失值方法 from sklearn.impute import SimpleImputer #以特征age為例子 Age=X["age"]#取出你要填補(bǔ)的特征 imp_mean = SimpleImputer() #實(shí)例化,默認(rèn)均值填補(bǔ) imp_mean = imp_mean.fit_transform(Age) #將缺失值用均值填補(bǔ)imp_median = SimpleImputer(strategy="median") #用中位數(shù)填補(bǔ) imp_median = imp_median.fit_transform(Age)imp_0 = SimpleImputer(strategy="constant",fill_value=0) #用0填補(bǔ) imp_0 = imp_0.fit_transform(Age) X["age"]=imp_0#別忘記填補(bǔ)完進(jìn)行特征更新用隨機(jī)森林算法來填補(bǔ)缺失值
#用隨機(jī)森林算法來填補(bǔ)缺失值,僅供參考 from sklearn.ensemble import RandomForestRegressor def RandomForestImputer(X_missing):#傳入你要填補(bǔ)的特征,返回已經(jīng)填補(bǔ)好的X_missing_reg = X_missing.copy()#找出數(shù)據(jù)集中,缺失值從小到大排列的特征們的順序,并且有了這些的索引sortindex = np.argsort(X_missing_reg.isnull().sum(axis=0)).values#np.argsort()返回的是從小到大排序的順序所對(duì)應(yīng)的索引for i in sortindex:#構(gòu)建我們的新特征矩陣(沒有被選中去填充的特征 + 原始的標(biāo)簽)和新標(biāo)簽(被選中去填充的特征)df = X_missing_regfillc = df.iloc[:,i]#新標(biāo)簽df = pd.concat([df.iloc[:,df.columns != i],pd.DataFrame(y_full)],axis=1)#新特征矩陣#在新特征矩陣中,對(duì)含有缺失值的列,進(jìn)行0的填補(bǔ)df_0 =SimpleImputer(missing_values=np.nan,strategy='constant',fill_value=0).fit_transform(df)#找出我們的訓(xùn)練集和測(cè)試集Ytrain = fillc[fillc.notnull()]# Ytrain是被選中要填充的特征中(現(xiàn)在是我們的標(biāo)簽),存在的那些值:非空值Ytest = fillc[fillc.isnull()]#Ytest 是被選中要填充的特征中(現(xiàn)在是我們的標(biāo)簽),不存在的那些值:空值。注意我們需要的不是Ytest的值,需要的是Ytest所帶的索引Xtrain = df_0[Ytrain.index,:]#在新特征矩陣上,被選出來的要填充的特征的非空值所對(duì)應(yīng)的記錄Xtest = df_0[Ytest.index,:]#在新特征矩陣上,被選出來的要填充的特征的空值所對(duì)應(yīng)的記錄#用隨機(jī)森林回歸來填補(bǔ)缺失值rfc = RandomForestRegressor(n_estimators=100)#實(shí)例化rfc = rfc.fit(Xtrain, Ytrain)#導(dǎo)入訓(xùn)練集進(jìn)行訓(xùn)練Ypredict = rfc.predict(Xtest)#用predict接口將Xtest導(dǎo)入,得到我們的預(yù)測(cè)結(jié)果(回歸結(jié)果),就是我們要用來填補(bǔ)空值的這些值#將填補(bǔ)好的特征返回到我們的原始的特征矩陣中X_missing_reg.loc[X_missing_reg.iloc[:,i].isnull(),i] = Ypredictreturn X_missing_reg4.處理分類型特征:編碼與啞變量
在現(xiàn)實(shí)中,許多標(biāo)簽和特征在數(shù)據(jù)收集完畢的時(shí)候,都不是以數(shù)字來表現(xiàn)的。比如說,學(xué)歷的取值可以是[“小 學(xué)”,“初中”,“高中”,“大學(xué)”],付費(fèi)方式可能包含[“支付寶”,“現(xiàn)金”,“微信”]等等。在這種情況下,為了讓數(shù)據(jù)適應(yīng)算法和庫,我們必須將數(shù)據(jù)進(jìn)行編碼,即是說,將文字型數(shù)據(jù)轉(zhuǎn)換為數(shù)值型。
代碼如下(示例):
對(duì)標(biāo)簽進(jìn)行編碼
#對(duì)標(biāo)簽進(jìn)行編碼 from sklearn.preprocessing import LabelEncoder y = data.iloc[:,-1] #要輸入的是標(biāo)簽,不是特征矩陣,所以允許一維 le = LabelEncoder() #實(shí)例化 lable=le.fit_transform(y) #也可以直接fit_transform一步到位 data.iloc[:,-1]=lable le.inverse_transform(label) #使用inverse_transform可以逆轉(zhuǎn)#如果不需要教學(xué)展示的話我會(huì)這么寫: from sklearn.preprocessing import LabelEncoder data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])對(duì)特征進(jìn)行編碼
#對(duì)特征進(jìn)行編碼 from sklearn.preprocessing import OrdinalEncoder #這個(gè)接口可以一次性對(duì)多個(gè)特征進(jìn)行編碼,如下是對(duì)第一行到倒數(shù)第二行的所有特征進(jìn)行編碼 data_ = data.copy()#復(fù)制一份數(shù)據(jù) data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])#進(jìn)行編碼獨(dú)熱編碼(啞變量)
1、能夠處理非連續(xù)型數(shù)值特征。
2、在一定程度上也擴(kuò)充了特征。
5.處理連續(xù)型特征:二值化與分段
代碼如下(示例):
二值化
#二值化、根據(jù)閾值將數(shù)據(jù)二值化(將特征值設(shè)置為0或1),用于處理連續(xù)型變量 from sklearn.preprocessing import Binarizer X = data_2.iloc[:,0].values.reshape(-1,1) #選出你想二值化的特征,類為特征專用,所以不能使用一維數(shù)組 transformer = Binarizer(threshold=30).fit_transform(X)#進(jìn)行二值化轉(zhuǎn)化多值化
#分段、將連續(xù)型變量劃分為分類變量的類,能夠?qū)⑦B續(xù)型變量排序后按順序分箱后編碼。 from sklearn.preprocessing import KBinsDiscretizer X = data.iloc[:,0].values.reshape(-1,1) est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')#分成三段,進(jìn)行等寬分箱,具體可以看下面參數(shù)。 est.fit_transform(X)6.數(shù)據(jù)集制造
代碼如下(示例):
#用于制造學(xué)習(xí)來用的分類數(shù)據(jù)集 def tensorGenCla(num_examples=500, num_inputs=2, num_class=3, deg_dispersion=[4, 2], bias=False):"""分類數(shù)據(jù)集創(chuàng)建函數(shù)。:param num_examples: 每個(gè)類別的數(shù)據(jù)數(shù)量:param num_inputs: 數(shù)據(jù)集特征數(shù)量:param num_class:數(shù)據(jù)集標(biāo)簽類別總數(shù):param deg_dispersion:數(shù)據(jù)分布離散程度參數(shù),需要輸入一個(gè)列表,其中第一個(gè)參數(shù)表示每個(gè)類別數(shù)組均值的參考、第二個(gè)參數(shù)表示隨機(jī)數(shù)組標(biāo)準(zhǔn)差。:param bias:建立模型邏輯回歸模型時(shí)是否帶入截距:return: 生成的特征張量和標(biāo)簽張量,其中特征張量是浮點(diǎn)型二維數(shù)組,標(biāo)簽張量是長(zhǎng)正型二維數(shù)組。"""cluster_l = torch.empty(num_examples, 1) # 每一類標(biāo)簽張量的形狀mean_ = deg_dispersion[0] # 每一類特征張量的均值的參考值std_ = deg_dispersion[1] # 每一類特征張量的方差lf = [] # 用于存儲(chǔ)每一類特征張量的列表容器ll = [] # 用于存儲(chǔ)每一類標(biāo)簽張量的列表容器k = mean_ * (num_class - 1) / 2 # 每一類特征張量均值的懲罰因子(視頻中部分是+1,實(shí)際應(yīng)該是-1)for i in range(num_class):data_temp = torch.normal(i * mean_ - k, std_, size=(num_examples, num_inputs)) # 生成每一類張量lf.append(data_temp) # 將每一類張量添加到lf中l(wèi)abels_temp = torch.full_like(cluster_l, i) # 生成類一類的標(biāo)簽ll.append(labels_temp) # 將每一類標(biāo)簽添加到ll中features = torch.cat(lf).float()labels = torch.cat(ll).long()if bias == True:features = torch.cat((features, torch.ones(len(features), 1)), 1) # 在特征張量中添加一列全是1的列return features, labels x,y=tensorGenCla(num_examples=100,num_inputs=19,num_class=3)#制造100個(gè)特征為19,有3分類的數(shù)據(jù)集7.樣本不均衡處理
過采樣(over-sampling):通過增加分類中少數(shù)類樣本的數(shù)量來實(shí)現(xiàn)樣本均衡,比較好的方法有SMOTE算法。
import pandas as pd from imblearn.over_sampling import SMOTE #過度抽樣處理庫SMOTE df=pd.read_table('data.txt') x=df.iloc[:,:-1]#取出特征 y=df.iloc[:,-1]#取出標(biāo)簽 groupby_data_orginal=df.groupby('label').count() #根據(jù)標(biāo)簽label分類匯總 model_smote=SMOTE() #建立smote模型對(duì)象 x_smote_resampled,y_smote_resampled=model_smote.fit_resample(x,y)#進(jìn)行過采樣 smote_resampled=pd.concat([pd.DataFrame(x_smote_resampled),pd.DataFrame(y_smote_resampled)],axis=1)#合并,得到過采樣的數(shù)據(jù)集 groupby_data_smote=smote_resampled.groupby('label').count()#再次統(tǒng)計(jì)分類匯總欠采樣(under-sampling):通過減少分類中多數(shù)類樣本的數(shù)量來實(shí)現(xiàn)樣本均衡
import pandas as pd from imblearn.under_sampling import RandomUnderSampler model_RandomUnderSampler=RandomUnderSampler() #建立RandomUnderSample模型對(duì)象 x_RandomUnderSample_resampled,y_RandomUnderSample_resampled=model_RandomUnderSampler.fit_resample(x,y) #進(jìn)行欠采樣 RandomUnderSampler_resampled=pd.concat([pd.DataFrame(x_RandomUnderSample_resampled),pd.DataFrame(y_RandomUnderSample_resampled)],axis=1)#合并,得到欠采樣的數(shù)據(jù)集8.訓(xùn)練集、測(cè)試集劃分
from sklearn.model_selection import train_test_split #導(dǎo)入你要分的數(shù)據(jù)特征X,標(biāo)簽Y Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,Y,test_size=0.3,random_state=420)三、特征選擇
特征工程主要包括特征提取、特征創(chuàng)造和特征選擇。特征提取針對(duì)不同的數(shù)據(jù)有不同的方法,例如,從文字,圖像,聲音等其他非結(jié)構(gòu)化數(shù)據(jù)中提取新信息作為特征。比如說,從淘寶寶貝的名稱中提取出產(chǎn)品類別、產(chǎn)品顏色,是否是網(wǎng)紅產(chǎn)品等等。往往特征提取是科研中的重要一環(huán)節(jié),這個(gè)后面單獨(dú)寫文章來總結(jié)。特征創(chuàng)造是把現(xiàn)有特征進(jìn)行組合,或互相計(jì)算,得到新的特征。比如說,我們有一列特征是速度,一列特征是距離,我們就可以通過讓兩列相處,創(chuàng)造新的特征:通過距離所花的時(shí)間。特征創(chuàng)造 在機(jī)器學(xué)習(xí)競(jìng)賽中用的較多,后面單獨(dú)寫文章來講解。特征選擇是從所有的特征中,選擇出有意義,對(duì)模型有幫助的特征,以避免必須將所有特征都導(dǎo)入模型去訓(xùn)練的情況
1.Filter過濾法
通常來說,我會(huì)建議,先使用方差過濾,然后使用互信息法來捕捉相關(guān)性,不過了解各種各樣的過濾方式也是必要的。
代碼如下(示例):
方差過濾:根據(jù)特征的方差大小,設(shè)置閾值來過濾
#方差過濾、根據(jù)特征的方差大小,設(shè)置閾值來過濾 from sklearn.feature_selection import VarianceThreshold selector = VarianceThreshold() #實(shí)例化,不填參數(shù)默認(rèn)方差為0 X_var0 = selector.fit_transform(X) #獲取刪除不合格特征之后的新特征矩陣 X = VairanceThreshold().fit_transform(X)#也可以直接寫成這樣,一步到位 X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)#用特征方中位數(shù)為閾值過濾卡方過濾:卡方檢驗(yàn)類feature_selection.chi2計(jì)算每個(gè)非負(fù)特征和標(biāo)簽之間的卡方統(tǒng)計(jì)量(特征和標(biāo)簽的相關(guān)性),并依照卡方統(tǒng)計(jì)量由高到低為特征排名
#卡方過濾,卡方檢驗(yàn)類feature_selection.chi2計(jì)算每個(gè)非負(fù)特征和標(biāo)簽之間的卡方統(tǒng)計(jì)量(特征和標(biāo)簽的相關(guān)性),并依照卡方統(tǒng)計(jì)量由高到低為特征排名 from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2 #假設(shè)在這里我一直我需要300個(gè)特征 X_fschi = SelectKBest(chi2, k=300).fit_transform(X, y)互信息法:互信息法是用來捕捉每個(gè)特征與標(biāo)簽之間的任意關(guān)系(包括線性和非線性關(guān)系)的過濾方法
#互信息法,互信息法是用來捕捉每個(gè)特征與標(biāo)簽之間的任意關(guān)系(包括線性和非線性關(guān)系)的過濾方法 from sklearn.feature_selection import mutual_info_classif as MIC result = MIC(X_fsvar,y) k = result.shape[0] - sum(result <= 0)2.Embedded嵌入法
嵌入法是一種讓算法自己決定使用哪些特征的方法,即特征選擇和算法訓(xùn)練同時(shí)進(jìn)行。在使用嵌入法時(shí),我們先使用某些機(jī)器學(xué)習(xí)的算法和模型進(jìn)行訓(xùn)練,得到各個(gè)特征的權(quán)值系數(shù),根據(jù)權(quán)值系數(shù)從大到小選擇特征。這些權(quán)值系數(shù)往往代表了特征對(duì)于模型的某種貢獻(xiàn)或某種重要性.
代碼如下(示例):
#通過設(shè)置模型重要程度閾值來篩選特征 from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier as RFC RFC_ = RFC(n_estimators =10,random_state=0)#利用隨機(jī)森林來篩選特征 X_embedded = SelectFromModel(RFC_,threshold=0.05).fit_transform(X,y) #這里設(shè)置貢獻(xiàn)度為0.05作為閾值,這個(gè)閾值跟你的特征數(shù)量有關(guān),正常情況下我們會(huì)通過學(xué)習(xí)曲線來確定閾值。 #RFC_.feature_importances_用來查看特征重要程度 #我們也可以畫學(xué)習(xí)曲線來找最佳閾值 import numpy as np import matplotlib.pyplot as plt RFC_.fit(X,y).feature_importances_ threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20) score = [] for i in threshold:X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()score.append(once) plt.plot(threshold,score) plt.show()3. Wrapper包裝法
包裝法也是一個(gè)特征選擇和算法訓(xùn)練同時(shí)進(jìn)行的方法,與嵌入法十分相似,它也是依賴于算法自身的選擇,比如coef_屬性或者特征重要性來完成特征選擇。但不同的是,我們往往使用一個(gè)目標(biāo)函數(shù)作為黑盒來幫助我們選取特征,而不是自己輸入某個(gè)評(píng)估指標(biāo)或統(tǒng)計(jì)量的閾值。
代碼如下(示例):
from sklearn.feature_selection import RFE RFC_ = RFC(n_estimators =10,random_state=0) selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y) #n_features_to_select是想要選擇的特征個(gè)數(shù),step表示每次迭代中希望移除的特征個(gè)數(shù)。 X_wrapper = selector.transform(X) #包裝法學(xué)習(xí)曲線,來確定最佳參數(shù) score = [] for i in range(1,751,50):X_wrapper = RFE(RFC_,n_features_to_select=i, step=50).fit_transform(X,y)once = cross_val_score(RFC_,X_wrapper,y,cv=5).mean()score.append(once) plt.figure(figsize=[20,5]) plt.plot(range(1,751,50),score) plt.xticks(range(1,751,50)) plt.show()4.PCA與LDA降維
降維算法不能簡(jiǎn)單的稱為特征選擇,它能減少特征的數(shù)量,又保留大部分有效信息,可以簡(jiǎn)單理解成一種特征壓縮的手段,其本質(zhì)是對(duì)矩陣的分解。
代碼如下(示例):
#PCA降維 from sklearn.decomposition import PCA X_dr = PCA(2).fit_transform(X)#輸入你要降到的維度數(shù)量,這里為2#如果你不確定你的超參數(shù),你可以用最大似然估計(jì)來選取你要壓縮到的維度,當(dāng)然你也可以繪制學(xué)習(xí)曲線來確定你的參數(shù) pca_mle = PCA(n_components="mle") X_mle = pca_mle.fit_transform(X) #LDA降維 from sklearn.lda import LDA #參數(shù)n_components為降維后的維數(shù) X=LDA(n_components=2).fit_transform(X, y)5.特征選擇經(jīng)驗(yàn)技巧
1.經(jīng)驗(yàn)來說,過濾法更快速,但更粗糙。
2.包裝法和嵌入法更精確,比較適合具體到算法去調(diào)整,但計(jì)算量比較大,運(yùn)行時(shí)間長(zhǎng)。
3.當(dāng)數(shù)據(jù)量很大的時(shí)候,優(yōu)先使用方差過濾和互信息法調(diào)整,再上其他特征選擇方法。
4.使用邏輯回歸時(shí),優(yōu)先使用嵌入法。使用支持向量機(jī)時(shí),優(yōu)先使用包裝法。迷茫的時(shí)候,從過濾法走起,看具體數(shù)據(jù)具體分析。
5.其實(shí)特征選擇只是特征工程中的第一步。真正的高手,往往使用特征創(chuàng)造或特征提取來尋找高級(jí)特征。在Kaggle之類的算法競(jìng)賽中,很多高分團(tuán)隊(duì)都是在高級(jí)特征上做文章,而這是比調(diào)參和特征選擇更難的,提升算法表現(xiàn)的高深方法。特征工程非常深?yuàn)W,雖然我們?nèi)粘?赡苡玫讲欢?#xff0c;但其實(shí)它非常美妙。若大家感興趣,也可以自己去網(wǎng)上搜一搜,多讀多看多試多想,技術(shù)逐漸會(huì)成為你的囊中之物。
四、模型搭建及優(yōu)化
1.模型評(píng)估
建模的評(píng)估一般可以分為回歸、分類和聚類的評(píng)估。
1.1回歸模型評(píng)估(平均絕對(duì)誤差、平均方差、R平方值)
代碼如下(示例):
#sklearn的調(diào)用,回歸常用評(píng)估函數(shù),輸入測(cè)試標(biāo)簽、模型預(yù)測(cè)標(biāo)簽 from sklearn.metrics import mean_absolute_error from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score mean_absolute_error(y_test,y_predict)#平均絕對(duì)誤差 mean_squared_error(y_test,y_predict)#平均方差 r2_score(y_test,y_predict)#R平方值1.2分類模型評(píng)估(分類報(bào)告、混淆矩陣、ROC曲線、交叉驗(yàn)證)
代碼如下(示例):
分類報(bào)告
#sklearn的調(diào)用,分類常用評(píng)估函數(shù),輸入你的測(cè)試集 #分類報(bào)告:輸出包括了precision/recall/fi-score/均值/分類個(gè)數(shù) from sklearn.metrics import classification_report y_true = y_test #測(cè)試集標(biāo)簽 y_pred = model.predict(x_test)#測(cè)試集預(yù)測(cè)值 target_names = ['class 0', 'class 1', 'class 2']#寫入你標(biāo)簽的類別名,有幾個(gè)就寫幾個(gè) print(classification_report(y_true, y_pred, target_names=target_names))混淆矩陣
#sklearn的調(diào)用,混淆矩陣 輸入你的測(cè)試集 from sklearn.metrics import confusion_matrix import matplotlib.pyplot as plt y_true = y_test #測(cè)試集標(biāo)簽 y_pred = model.predict(x_test)#測(cè)試集預(yù)測(cè)值 confusion_mat = confusion_matrix(y_true, y_pred) print(confusion_mat) #看看混淆矩陣長(zhǎng)啥樣 #sklearn的調(diào)用,混淆矩陣可視化 def plot_confusion_matrix(confusion_mat): '''''將混淆矩陣畫圖并顯示出來''' plt.imshow(confusion_mat, interpolation='nearest', cmap=plt.cm.gray) plt.title('Confusion matrix') plt.colorbar() tick_marks = np.arange(confusion_mat.shape[0]) plt.xticks(tick_marks, tick_marks) plt.yticks(tick_marks, tick_marks) plt.ylabel('True label') plt.xlabel('Predicted label') plt.show() plot_confusion_matrix(confusion_mat)ROC曲線
#sklearn的調(diào)用,繪制ROC曲線,AUC就是ROC 曲線下的面積,通常情況下數(shù)值介于0.5-1之間,可以評(píng)價(jià)分類器的好壞,數(shù)值越大說明越好。 from sklearn.metrics import roc_curve as ROC import matplotlib.pyplot as plt #導(dǎo)入模型,測(cè)試集 def roc_auc_score_plot(clf,Xtest,Ytest):FPR, Recall, thresholds = ROC(Ytest,clf.decision_function(Xtest),pos_label=1)area = roc_auc_score(Ytest,clf.decision_function(Xtest))#計(jì)算auc的值plt.figure()plt.plot(FPR, Recall, color='red',label='ROC curve (area = %0.2f)' % area)plt.plot([0, 1], [0, 1], color='black', linestyle='--')plt.xlim([-0.05, 1.05])plt.ylim([-0.05, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('Recall')plt.title('Receiver operating characteristic example')plt.legend(loc="lower right")plt.show()交叉驗(yàn)證
from sklearn.model_selection import cross_val_score scores = cross_val_score(model,X, y,cv=3)#cv:默認(rèn)是3折交叉驗(yàn)證,可以修改cv=5,變成5折交叉驗(yàn)證1.3聚類模型評(píng)估(ARI、輪廓系數(shù))
代碼如下(示例):
ARI:取值范圍為[-1,1],負(fù)數(shù)代表結(jié)果不好,值越大意味著聚類結(jié)果與真實(shí)情況越吻合。ARI可用于聚類算法之間的比較
#ARI接口 from sklearn import metrics labels_true = [0,0,0,1,1,1]#真實(shí)標(biāo)簽 labels_pred = [0,0,1,1,2,2]#預(yù)測(cè)標(biāo)簽 print(metrics.adjusted_rand_score(labels_true,labels_pred))輪廓系數(shù):用于沒有基準(zhǔn)可用時(shí)的聚類質(zhì)量評(píng)估,通過考察簇的分離情況和簇的緊湊度進(jìn)行聚類評(píng)估。輪廓系數(shù)的值在-1到1之間,輪廓系數(shù)越接近于1,聚類效果越好。
#一個(gè)求輪廓系數(shù)的案例 import numpy as np from sklearn.cluster import KMeans from sklearn import metrics from sklearn.metrics import silhouette_score from sklearn.datasets import load_iris # 導(dǎo)入數(shù)據(jù)集iris X = load_iris().data # 載入數(shù)據(jù)集 kmeans_model = KMeans(n_clusters=3,random_state=1).fit(X) labels = kmeans_model.labels_ metrics.silhouette_score(X,labels,metric='euclidean')#得到輪廓系數(shù)2.機(jī)器學(xué)習(xí)常用回歸模型
2.1 線性回歸
代碼如下(示例):
from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error lin_reg = LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None) lin_reg.fit(X_train,y_train)#傳入訓(xùn)練數(shù)據(jù) print ('線性回歸模型的均方誤差為:',mean_squared_error(lin_reg.inverse_transform(y_test),lin_reg.inverse_tranform(lr_y_predict)))#均方誤差,看模型效果2.2 決策樹回歸
代碼如下(示例):
%matplotlib inline from sklearn import tree clf = tree.DecisionTreeRegressor() clf = clf.fit(X_train,y_train)參數(shù)說明
1、 criterion:特征選取方法,mse或mae,前者是均方差,后者是和均值的差的絕對(duì)值之和,一般用前者,因?yàn)榍罢咄ǔ8鼮榫珳?zhǔn),且方便計(jì)算
2、 splitter: 特征劃分點(diǎn)選擇方法,可以是best或random,前者是在特征的全部劃分點(diǎn)中找到最優(yōu)的劃分點(diǎn),后者是在隨機(jī)選擇的部分劃分點(diǎn)找到局部最優(yōu)的劃分點(diǎn),一般在樣本量不大的時(shí)候,選擇best,樣本量過大,可以用random
3、 max_depth: 樹的最大深度,默認(rèn)可以不輸入,那么不會(huì)限制子樹的深度,一般在樣本少特征也少的情況下,可以不做限制,但是樣本過多或者特征過多的情況下,可以設(shè)定一個(gè)上限,一般取10~100
4、 min_samples_split:節(jié)點(diǎn)再劃分所需最少樣本數(shù),如果節(jié)點(diǎn)上的樣本樹已經(jīng)低于這個(gè)值,則不會(huì)再尋找最優(yōu)的劃分點(diǎn)進(jìn)行劃分,且以結(jié)點(diǎn)作為葉子節(jié)點(diǎn),默認(rèn)是2,如果樣本過多的情況下,可以設(shè)定一個(gè)閾值,具體可根據(jù)業(yè)務(wù)需求和數(shù)據(jù)量來定
5、 min_samples_leaf: 葉子節(jié)點(diǎn)所需最少樣本數(shù),如果達(dá)不到這個(gè)閾值,則同一父節(jié)點(diǎn)的所有葉子節(jié)點(diǎn)均被剪枝,這是一個(gè)防止過擬合的參數(shù),可以輸入一個(gè)具體的值,或小于1的數(shù)(會(huì)根據(jù)樣本量計(jì)算百分比)
6、 min_weight_fraction_leaf: 葉子節(jié)點(diǎn)所有樣本權(quán)重和,如果低于閾值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝,默認(rèn)是0,就是不考慮權(quán)重問題。這個(gè)一般在樣本類別偏差較大或有較多缺失值的情況下會(huì)考慮
7、 max_features: 劃分考慮最大特征數(shù),不輸入則默認(rèn)全部特征,可以選 log2N,sqrt(N),auto或者是小于1的浮點(diǎn)數(shù)(百分比)或整數(shù)(具體數(shù)量的特征)。如果特征特別多時(shí)如大于50,可以考慮選擇auto來控制決策樹的生成時(shí)間
8、 max_leaf_nodes:最大葉子節(jié)點(diǎn)數(shù),防止過擬合,默認(rèn)不限制,如果設(shè)定了閾值,那么會(huì)在閾值范圍內(nèi)得到最優(yōu)的決策樹,樣本量過多時(shí)可以設(shè)定
9、min_impurity_decrease/min_impurity_split: 劃分最需最小不純度,前者是特征選擇時(shí)低于就不考慮這個(gè)特征,后者是如果選取的最優(yōu)特征劃分后達(dá)不到這個(gè)閾值,則不再劃分,節(jié)點(diǎn)變成葉子節(jié)點(diǎn)
10、presort: 是否排序,基本不用管
2.3 支持向量機(jī)回歸
代碼如下(示例):
from sklearn.svm import LinearSVC svm_clf=LinearSVC() svm_clf.fit(X_train,y_train)2.4 K近鄰回歸
代碼如下(示例):
from sklearn import neighbors model_KNeighborsRegressor = neighbors.KNeighborsRegressor() model_KNeighborsRegressor.fit(X_train,y_train)2.5 隨機(jī)森林回歸
代碼如下(示例):
from sklearn import ensemble model_RandomForestRegressor = ensemble.RandomForestRegressor(n_estimators=100) model_RandomForestRegresso.fit(X_train,y_train)重要參數(shù)
n_estimators:森林中基評(píng)估器的數(shù)量,即樹的數(shù)量。n_estimators越大模型效果越好,但達(dá)到一定程度時(shí),精確性趨于穩(wěn)定。默認(rèn)為100。
criterion:衡量標(biāo)準(zhǔn)。gini系數(shù)和信息熵2種。
max_depth:樹的最大深度
mini_sample_leaf:min_samples_leaf=1,二叉樹
mini_samples_split:mini_samples_split=2一個(gè)節(jié)點(diǎn)分成幾類樣本
max_features:樹的特征個(gè)數(shù)
random_state :隨機(jī)種子,選42吧,宇宙終極奧秘。
2.6 Adaboost 回歸
代碼如下(示例):
from sklearn import ensemble model_AdaBoostRegressor = ensemble.AdaBoostRegressor(n_estimators=50) model_AdaBoostRegressor.fit(X_train,y_train)① criterion: 特征選取方法,分類是gini(基尼系數(shù)),entropy(信息增益),通常選擇gini,即CART算法,如果選擇后者,則是ID3和C4,.5;回歸是mse或mae,前者是均方差,后者是和均值的差的絕對(duì)值之和,一般用前者,因?yàn)榍罢咄ǔ8鼮榫珳?zhǔn),且方便計(jì)算
② splitter: 特征劃分點(diǎn)選擇方法,可以是best或random,前者是在特征的全部劃分點(diǎn)中找到最優(yōu)的劃分點(diǎn),后者是在隨機(jī)選擇的部分劃分點(diǎn)找到局部最優(yōu)的劃分點(diǎn),一般在樣本量不大的時(shí)候,選擇best,樣本量過大,可以用random
③ max_depth: 樹的最大深度,默認(rèn)可以不輸入,那么不會(huì)限制子樹的深度,一般在樣本少特征也少的情況下,可以不做限制,但是樣本過多或者特征過多的情況下,可以設(shè)定一個(gè)上限,一般取10~100
④ min_samples_split:節(jié)點(diǎn)再劃分所需最少樣本數(shù),如果節(jié)點(diǎn)上的樣本樹已經(jīng)低于這個(gè)值,則不會(huì)再尋找最優(yōu)的劃分點(diǎn)進(jìn)行劃分,且以結(jié)點(diǎn)作為葉子節(jié)點(diǎn),默認(rèn)是2,如果樣本過多的情況下,可以設(shè)定一個(gè)閾值,具體可根據(jù)業(yè)務(wù)需求和數(shù)據(jù)量來定
⑤ min_samples_leaf: 葉子節(jié)點(diǎn)所需最少樣本數(shù),如果達(dá)不到這個(gè)閾值,則同一父節(jié)點(diǎn)的所有葉子節(jié)點(diǎn)均被剪枝,這是一個(gè)防止過擬合的參數(shù),可以輸入一個(gè)具體的值,或小于1的數(shù)(會(huì)根據(jù)樣本量計(jì)算百分比)
⑥ min_weight_fraction_leaf: 葉子節(jié)點(diǎn)所有樣本權(quán)重和,如果低于閾值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝,默認(rèn)是0,就是不考慮權(quán)重問題。這個(gè)一般在樣本類別偏差較大或有較多缺失值的情況下會(huì)考慮
⑦ max_features: 劃分考慮最大特征數(shù),不輸入則默認(rèn)全部特征,可以選 log2N,sqrt(N),auto或者是小于1的浮點(diǎn)數(shù)(百分比)或整數(shù)(具體數(shù)量的特征)。如果特征特別多時(shí)如大于50,可以考慮選擇auto來控制決策樹的生成時(shí)間
⑧ max_leaf_nodes:最大葉子節(jié)點(diǎn)數(shù),防止過擬合,默認(rèn)不限制,如果設(shè)定了閾值,那么會(huì)在閾值范圍內(nèi)得到最優(yōu)的決策樹,樣本量過多時(shí)可以設(shè)定
⑨min_impurity_decrease/min_impurity_split: 劃分最需最小不純度,前者是特征選擇時(shí)低于就不考慮這個(gè)特征,后者是如果選取的最優(yōu)特征劃分后達(dá)不到這個(gè)閾值,則不再劃分,節(jié)點(diǎn)變成葉子節(jié)點(diǎn)
2.7 梯度增強(qiáng)隨機(jī)森林回歸
代碼如下(示例):
from sklearn import ensemble model_GradientBoostingRegressor = ensemble.GradientBoostingRegressor(n_estimators=100) model_GradientBoostingRegressor.fit(X_train,y_train)參數(shù)參考隨機(jī)森林
2.8 Bagging 回歸
代碼如下(示例):
from sklearn.ensemble import BaggingRegressor model_BaggingRegressor = BaggingRegressor() model_BaggingRegressor.fit(X_train,y_train)重要參數(shù)
base_estimator:Object or None。None代表默認(rèn)是DecisionTree,Object可以指定基估計(jì)器(base estimator)。
n_estimators:int, optional (default=10) 。 要集成的基估計(jì)器的個(gè)數(shù)。
max_samples: int or float, optional (default=1.0)。決定從x_train抽取去訓(xùn)練基估計(jì)器的樣本數(shù)量。int 代表抽取數(shù)量,float代表抽取比例
max_features : int or float, optional (default=1.0)。決定從x_train抽取去訓(xùn)練基估計(jì)器的特征數(shù)量。int 代表抽取數(shù)量,float代表抽取比例
bootstrap : boolean, optional (default=True) 決定樣本子集的抽樣方式(有放回和不放回)
bootstrap_features : boolean, optional (default=False)決定特征子集的抽樣方式(有放回和不放回)
oob_score : bool 決定是否使用包外估計(jì)(out of bag estimate)泛化誤差
warm_start : bool, optional (default=False) true代表
n_jobs : int, optional (default=1)
random_state : 選42吧,宇宙終極奧秘。
2.9 ExtraTree 回歸
代碼如下(示例):
from sklearn.tree import ExtraTreeRegressor model_ExtraTreeRegressor = ExtraTreeRegressor() model_ExtraTreeRegressor.fit(X_train,y_train)2.10 Xgboost回歸
代碼如下(示例):
from xgboost.sklearn import XGBRegressor gsearch1 = GridSearchCV(estimator=XGBRegressor(scoring='ls',seed=27), param_grid=param_grid, cv=5) gsearch1.fit(X_train, y_train)重要參數(shù)
n_estimators(基本學(xué)習(xí)器的數(shù)量):要擬合的弱學(xué)習(xí)器數(shù)量,該值越大,模型越復(fù)雜,越容易過擬合
max_depth(基本學(xué)習(xí)器的深度): 樹的最大深度,該值越大,模型越復(fù)雜,越容易擬合訓(xùn)練數(shù)據(jù),越容易過擬合;樹生長(zhǎng)停止條件之一
learning_rate(學(xué)習(xí)率):每個(gè)基模型的懲罰項(xiàng),降低單個(gè)模型的影響,為了防止過擬合,該值越接近1越容易或擬合,越接近0精度越低
gamma(損失減少閾值):在樹的葉節(jié)點(diǎn)上進(jìn)一步劃分所需的最小損失減少,在模型訓(xùn)練過程中,只有損失下降的值超過該值,才會(huì)繼續(xù)分裂節(jié)點(diǎn),該值越小模型越復(fù)雜,越容易過擬合,樹生長(zhǎng)停止條件之一
reg_alpha(L1正則化):L1正則化用于對(duì)葉子的個(gè)數(shù)進(jìn)行懲罰,用于防止過擬合
reg_lambda(L2正則化):L2正則化用于對(duì)葉子節(jié)點(diǎn)的得分進(jìn)行懲罰,L1和L2正則化項(xiàng)共同懲罰樹的復(fù)雜度,值越小模型的魯棒性越高
min_child_weight(子集最小權(quán)重):最小樣本的權(quán)重之和,在樹的生長(zhǎng)過程中,如果樣本的權(quán)重之和小于該值,將不再分裂;樹生長(zhǎng)停止條件之一
subsample(樣本子采樣):訓(xùn)練集對(duì)樣本實(shí)例的采樣率,用于防止過擬合
colsample_bytree(列子采樣):每棵樹對(duì)特征的采樣率,用于防止過擬合
3.機(jī)器學(xué)習(xí)常用分類模型
3.1 決策樹分類
代碼如下(示例):
from sklearn.tree import DecisionTreeClassifier as DTC model=DTC(max_depth=8,random_state=42) model.fit(X_train, y_train)重要參數(shù)
1、 criterion: 特征選取方法,可以是gini(基尼系數(shù)),entropy(信息增益),通常選擇gini,即CART算法,如果選擇后者,則是ID3和C4,.5
2、 splitter: 特征劃分點(diǎn)選擇方法,可以是best或random,前者是在特征的全部劃分點(diǎn)中找到最優(yōu)的劃分點(diǎn),后者是在隨機(jī)選擇的部分劃分點(diǎn)找到局部最優(yōu)的劃分點(diǎn),一般在樣本量不大的時(shí)候,選擇best,樣本量過大,可以用random
3、 max_depth: 樹的最大深度,默認(rèn)可以不輸入,那么不會(huì)限制子樹的深度,一般在樣本少特征也少的情況下,可以不做限制,但是樣本過多或者特征過多的情況下,可以設(shè)定一個(gè)上限,一般取10~100
4、 min_samples_split:節(jié)點(diǎn)再劃分所需最少樣本數(shù),如果節(jié)點(diǎn)上的樣本樹已經(jīng)低于這個(gè)值,則不會(huì)再尋找最優(yōu)的劃分點(diǎn)進(jìn)行劃分,且以結(jié)點(diǎn)作為葉子節(jié)點(diǎn),默認(rèn)是2,如果樣本過多的情況下,可以設(shè)定一個(gè)閾值,具體可根據(jù)業(yè)務(wù)需求和數(shù)據(jù)量來定
5、 min_samples_leaf: 葉子節(jié)點(diǎn)所需最少樣本數(shù),如果達(dá)不到這個(gè)閾值,則同一父節(jié)點(diǎn)的所有葉子節(jié)點(diǎn)均被剪枝,這是一個(gè)防止過擬合的參數(shù),可以輸入一個(gè)具體的值,或小于1的數(shù)(會(huì)根據(jù)樣本量計(jì)算百分比)
6、 min_weight_fraction_leaf: 葉子節(jié)點(diǎn)所有樣本權(quán)重和,如果低于閾值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝,默認(rèn)是0,就是不考慮權(quán)重問題。這個(gè)一般在樣本類別偏差較大或有較多缺失值的情況下會(huì)考慮
7、 max_features: 劃分考慮最大特征數(shù),不輸入則默認(rèn)全部特征,可以選 log2N,sqrt(N),auto或者是小于1的浮點(diǎn)數(shù)(百分比)或整數(shù)(具體數(shù)量的特征)。如果特征特別多時(shí)如大于50,可以考慮選擇auto來控制決策樹的生成時(shí)間
8、 max_leaf_nodes:最大葉子節(jié)點(diǎn)數(shù),防止過擬合,默認(rèn)不限制,如果設(shè)定了閾值,那么會(huì)在閾值范圍內(nèi)得到最優(yōu)的決策樹,樣本量過多時(shí)可以設(shè)定
9、min_impurity_decrease/min_impurity_split: 劃分最需最小不純度,前者是特征選擇時(shí)低于就不考慮這個(gè)特征,后者是如果選取的最優(yōu)特征劃分后達(dá)不到這個(gè)閾值,則不再劃分,節(jié)點(diǎn)變成葉子節(jié)點(diǎn)
10、class_weight: 類別權(quán)重,在樣本有較大缺失值或類別偏差較大時(shí)可選,防止決策樹向類別過大的樣本傾斜。可設(shè)定或者balanced,后者會(huì)自動(dòng)根據(jù)樣本的數(shù)量分布計(jì)算權(quán)重,樣本數(shù)少則權(quán)重高,與min_weight_fraction_leaf對(duì)應(yīng)
11、presort: 是否排序,基本不用管
3.2 隨機(jī)森林分類
代碼如下(示例):
from sklearn.ensemble import RandomForestClassifier as RFC model=RFC(n_estimators=100,random_state=42,n_jobs=8) model.fit(X_train, y_train)重要參數(shù)
n_estimators:森林中基評(píng)估器的數(shù)量,即樹的數(shù)量。n_estimators越大模型效果越好,但達(dá)到一定程度時(shí),精確性趨于穩(wěn)定。默認(rèn)為100。
criterion:衡量標(biāo)準(zhǔn)。gini系數(shù)和信息熵2種。
max_depth:樹的最大深度
mini_sample_leaf:min_samples_leaf=1,二叉樹
mini_samples_split:mini_samples_split=2一個(gè)節(jié)點(diǎn)分成幾類樣本
max_features:樹的特征個(gè)數(shù)
random_state :隨機(jī)種子
3.3 Adaboost分類
代碼如下(示例):
from sklearn.ensemble import AdaBoostClassifier model=AdaBoostClassifier_() model.fit(X_train, y_train)重要參數(shù)
base_estimator:基分類器,默認(rèn)是決策樹,在該分類器基礎(chǔ)上進(jìn)行boosting,理論上可以是任意一個(gè)分類器,但是如果是其他分類器時(shí)需要指明樣本權(quán)重。
n_estimators:基分類器提升(循環(huán))次數(shù),默認(rèn)是50次,這個(gè)值過大,模型容易過擬合;值過小,模型容易欠擬合。
learning_rate:學(xué)習(xí)率,表示梯度收斂速度,默認(rèn)為1,如果過大,容易錯(cuò)過最優(yōu)值,如果過小,則收斂速度會(huì)很慢;該值需要和n_estimators進(jìn)行一個(gè)權(quán)衡,當(dāng)分類器迭代次數(shù)較少時(shí),學(xué)習(xí)率可以小一些,當(dāng)?shù)螖?shù)較多時(shí),學(xué)習(xí)率可以適當(dāng)放大。
algorithm:boosting算法,也就是模型提升準(zhǔn)則,有兩種方式SAMME, 和SAMME.R兩種,默認(rèn)是SAMME.R,兩者的區(qū)別主要是弱學(xué)習(xí)器權(quán)重的度量,前者是對(duì)樣本集預(yù)測(cè)錯(cuò)誤的概率進(jìn)行劃分的,后者是對(duì)樣本集的預(yù)測(cè)錯(cuò)誤的比例,即錯(cuò)分率進(jìn)行劃分的,默認(rèn)是用的SAMME.R。
random_state:隨機(jī)種子設(shè)置。
3.4 GBDT分類
代碼如下(示例):
from sklearn.ensemble import GradientBoostingClassifier as GBDT model=GBDT(n_estimators=100,random_state=1412) model.fit(X_train, y_train)重要參數(shù)
1) n_estimators: 也就是弱學(xué)習(xí)器的最大迭代次數(shù),或者說最大的弱學(xué)習(xí)器的個(gè)數(shù)。一般來說n_estimators太小,容易欠擬合,n_estimators太大,又容易過擬合,一般選擇一個(gè)適中的數(shù)值。默認(rèn)是100。在實(shí)際調(diào)參的過程中,我們常常將n_estimators和下面介紹的參數(shù)learning_rate一起考慮。
2) learning_rate: 即每個(gè)弱學(xué)習(xí)器的權(quán)重縮減系數(shù)𝜈ν,也稱作步長(zhǎng),在原理篇的正則化章節(jié)我們也講到了,加上了正則化項(xiàng),我們的強(qiáng)學(xué)習(xí)器的迭代公式為𝑓𝑘(𝑥)=𝑓𝑘?1(𝑥)+𝜈?𝑘(𝑥)fk(x)=fk?1(x)+νhk(x)。𝜈ν的取值范圍為0<𝜈≤10<ν≤1。對(duì)于同樣的訓(xùn)練集擬合效果,較小的𝜈ν意味著我們需要更多的弱學(xué)習(xí)器的迭代次數(shù)。通常我們用步長(zhǎng)和迭代最大次數(shù)一起來決定算法的擬合效果。所以這兩個(gè)參數(shù)n_estimators和learning_rate要一起調(diào)參。一般來說,可以從一個(gè)小一點(diǎn)的𝜈ν開始調(diào)參,默認(rèn)是1。
3) subsample: 即我們?cè)谠砥恼齽t化章節(jié)講到的子采樣,取值為(0,1]。注意這里的子采樣和隨機(jī)森林不一樣,隨機(jī)森林使用的是放回抽樣,而這里是不放回抽樣。如果取值為1,則全部樣本都使用,等于沒有使用子采樣。如果取值小于1,則只有一部分樣本會(huì)去做GBDT的決策樹擬合。選擇小于1的比例可以減少方差,即防止過擬合,但是會(huì)增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間,默認(rèn)是1.0,即不使用子采樣。
4) init: 即我們的初始化的時(shí)候的弱學(xué)習(xí)器,擬合對(duì)應(yīng)原理篇里面的𝑓0(𝑥)f0(x),如果不輸入,則用訓(xùn)練集樣本來做樣本集的初始化分類回歸預(yù)測(cè)。否則用init參數(shù)提供的學(xué)習(xí)器做初始化分類回歸預(yù)測(cè)。一般用在我們對(duì)數(shù)據(jù)有先驗(yàn)知識(shí),或者之前做過一些擬合的時(shí)候,如果沒有的話就不用管這個(gè)參數(shù)了。
5) loss: 即我們GBDT算法中的損失函數(shù)。分類模型和回歸模型的損失函數(shù)是不一樣的。
對(duì)于分類模型,有對(duì)數(shù)似然損失函數(shù)"deviance"和指數(shù)損失函數(shù)"exponential"兩者輸入選擇。默認(rèn)是對(duì)數(shù)似然損失函數(shù)"deviance"。在原理篇中對(duì)這些分類損失函數(shù)有詳細(xì)的介紹。一般來說,推薦使用默認(rèn)的"deviance"。它對(duì)二元分離和多元分類各自都有比較好的優(yōu)化。而指數(shù)損失函數(shù)等于把我們帶到了Adaboost算法。
對(duì)于回歸模型,有均方差"ls", 絕對(duì)損失"lad", Huber損失"huber"和分位數(shù)損失“quantile”。默認(rèn)是均方差"ls"。一般來說,如果數(shù)據(jù)的噪音點(diǎn)不多,用默認(rèn)的均方差"ls"比較好。如果是噪音點(diǎn)較多,則推薦用抗噪音的損失函數(shù)"huber"。而如果我們需要對(duì)訓(xùn)練集進(jìn)行分段預(yù)測(cè)的時(shí)候,則采用“quantile”。
6) alpha:這個(gè)參數(shù)只有GradientBoostingRegressor有,當(dāng)我們使用Huber損失"huber"和分位數(shù)損失“quantile”時(shí),需要指定分位數(shù)的值。默認(rèn)是0.9,如果噪音點(diǎn)較多,可以適當(dāng)降低這個(gè)分位數(shù)的值。
3.5 CatBoost分類
代碼如下(示例):
from catboost import Pool, CatBoostClassifier train_data = [["summer", 1924, 44],["summer", 1932, 37],["winter", 1980, 37],["summer", 2012, 204]] eval_data = [["winter", 1996, 197],["winter", 1968, 37],["summer", 2002, 77],["summer", 1948, 59]]cat_features = [0] train_label = ["France", "USA", "USA", "UK"] eval_label = ["USA", "France", "USA", "UK"] train_dataset = Pool(data=train_data,label=train_label,cat_features=cat_features)eval_dataset = Pool(data=eval_data,label=eval_label,cat_features=cat_features) # Initialize CatBoostClassifier model = CatBoostClassifier(iterations=10,learning_rate=1,depth=2,loss_function='MultiClass') # Fit model model.fit(train_dataset) # Get predicted classes preds_class = model.predict(eval_dataset) # Get predicted probabilities for each class preds_proba = model.predict_proba(eval_dataset) # Get predicted RawFormulaVal preds_raw = model.predict(eval_dataset, prediction_type='RawFormulaVal')重要參數(shù)
loss_function 損失函數(shù),支持的有RMSE, Logloss, MAE, CrossEntropy, Quantile, LogLinQuantile, Multiclass, MultiClassOneVsAll, MAPE,Poisson。默認(rèn)RMSE。
custom_metric 訓(xùn)練過程中輸出的度量值。這些功能未經(jīng)優(yōu)化,僅出于信息目的顯示。默認(rèn)None。
eval_metric 用于過擬合檢驗(yàn)(設(shè)置True)和最佳模型選擇(設(shè)置True)的loss function,用于優(yōu)化。
iterations 最大樹數(shù)。默認(rèn)1000。
learning_rate 學(xué)習(xí)率。默認(rèn)0.03。
random_seed 訓(xùn)練時(shí)候的隨機(jī)種子
l2_leaf_reg L2正則參數(shù)。默認(rèn)3
bootstrap_type 定義權(quán)重計(jì)算邏輯,可選參數(shù):Poisson (supported for GPU only)/Bayesian/Bernoulli/No,默認(rèn)為Bayesian
bagging_temperature 貝葉斯套袋控制強(qiáng)度,區(qū)間[0, 1]。默認(rèn)1。
subsample 設(shè)置樣本率,當(dāng)bootstrap_type為Poisson或Bernoulli時(shí)使用,默認(rèn)66
sampling_frequency設(shè)置創(chuàng)建樹時(shí)的采樣頻率,可選值PerTree/PerTreeLevel,默認(rèn)為PerTreeLevel
random_strength 分?jǐn)?shù)標(biāo)準(zhǔn)差乘數(shù)。默認(rèn)1。
use_best_model 設(shè)置此參數(shù)時(shí),需要提供測(cè)試數(shù)據(jù),樹的個(gè)數(shù)通過訓(xùn)練參數(shù)和優(yōu)化loss function獲得。默認(rèn)False。
best_model_min_trees 最佳模型應(yīng)該具有的樹的最小數(shù)目。
depth 樹深,最大16,建議在1到10之間。默認(rèn)6。
ignored_features 忽略數(shù)據(jù)集中的某些特征。默認(rèn)None。
one_hot_max_size 如果feature包含的不同值的數(shù)目超過了指定值,將feature轉(zhuǎn)化為float。默認(rèn)False
has_time 在將categorical features轉(zhuǎn)化為numerical
nan_mode處理輸入數(shù)據(jù)中缺失值的方法,包括Forbidden(禁止存在缺失),Min(用最小值補(bǔ)),Max(用最大值補(bǔ))。默認(rèn)Min。
fold_permutation_block_size數(shù)據(jù)集中的對(duì)象在隨機(jī)排列之前按塊分組。此參數(shù)定義塊的大小。值越小,訓(xùn)練越慢。較大的值可能導(dǎo)致質(zhì)量下降。
leaf_estimation_method 計(jì)算葉子值的方法,Newton/ Gradient。默認(rèn)Gradient。
leaf_estimation_iterations 計(jì)算葉子值時(shí)梯度步數(shù)。
leaf_estimation_backtracking 在梯度下降期間要使用的回溯類型。
fold_len_multiplier folds長(zhǎng)度系數(shù)。設(shè)置大于1的參數(shù),在參數(shù)較小時(shí)獲得最佳結(jié)果。默認(rèn)2。
approx_on_full_history 計(jì)算近似值,False:使用1/fold_len_multiplier計(jì)算;True:使用fold中前面所有行計(jì)算。默認(rèn)False。
class_weights 類別的權(quán)重。默認(rèn)None。
scale_pos_weight 二進(jìn)制分類中class 1的權(quán)重。該值用作class 1中對(duì)象權(quán)重的乘數(shù)。
allow_const_label 使用它為所有對(duì)象訓(xùn)練具有相同標(biāo)簽值的數(shù)據(jù)集的模型。默認(rèn)為False
3.6 ExtraTress分類
代碼如下(示例):
from sklearn.ensemble import ExtraTreesClassifier model = ExtraTreesClassifier(n_estimators=500,bootstrap=True,oob_score=True,random_state=666) model.fit(X_train, y_train)3.7 KNN分類
代碼如下(示例):
from sklearn.neighbors import KNeighborsClassifier as KNNC model=KNNC(n_neighbors=10,n_jobs=8) model.fit(X_train, y_train)3.8 SVM分類
代碼如下(示例):
from sklearn.svm import SVC model=SVC() model.fit(X_train, y_train)3.9 XGBoost分類
代碼如下(示例):
from xgboost.sklearn import XGBClassifier model=XGBClassifier() model.fit(X_train, y_train)1. base_score:0.5
2. booster: ‘gbtree’ — 基分類器為樹模型,默認(rèn)值;‘gbliner’ — 基分類器為線性模型。
3. colsample_bylevel: 控制樹的每一級(jí)的每一次分裂,對(duì)列數(shù)的采樣比重,默認(rèn)值為1.
4. colsample_bynode: 控制樹的每一個(gè)節(jié)點(diǎn)的每一次分裂,對(duì)列數(shù)的采樣比重,默認(rèn)值為1.
5. colsample_bytree: 訓(xùn)練每棵樹時(shí),使用特征占全部特征的比例,默認(rèn)值為1,典型值為0.5-1.調(diào)節(jié)該參數(shù)可以防止過擬合。
6. gamma: 懲罰項(xiàng)系數(shù),制定節(jié)點(diǎn)斐裂所需的最小損失函數(shù)下降值,默認(rèn)值為0。
7. learning_rate: 學(xué)習(xí)率,控制每次迭代更新權(quán)重時(shí)的步長(zhǎng),默認(rèn)值為0.1。該參數(shù)可參考上篇AdaBoostClassifier。
8. max_delta_step: 限制每棵樹權(quán)重改變的最大步長(zhǎng),默認(rèn)值為0,即沒有約束。如果為正值,則這個(gè)算法更加保守。通常不需要設(shè)置該參數(shù),但是當(dāng)樣本十分不平衡時(shí),對(duì)邏輯回歸很有幫助。
9. max_depth: 樹的深度,默認(rèn)值是6,值過大容易過擬合,值過小容易欠擬合。該參數(shù)同AdaBoostClassifier和RandomForestClassifier的max_depth參數(shù)。
10. min_child_weight: 默認(rèn)值為1,當(dāng)值越大時(shí),越容易欠擬合;當(dāng)值越小時(shí),越容易過擬合。
11. missing:
12. n_estimators: 基學(xué)習(xí)器的個(gè)數(shù),默認(rèn)值是100。該參數(shù)可參考上篇AdaBoostClassifier。
13. n_jobs: 有多少處理器可以使用。默認(rèn)值為None,即1,即只有一個(gè)處理器可以使用,-1意味著沒有限制。
14. objective: 目標(biāo)函數(shù)。
回歸:‘reg:linear’, ‘reg:logistic’;
二分類:‘binary:logistic’ 概率(默認(rèn)值),'binary:logitraw’類別
多分類:multi:softmax num_class=n 返回類別,multi:softmax num_class=n 返回概率
rank:pairwise
15. random_state: 隨機(jī)種子
16. reg_alpha: L1正則化,在高維度的情況下,調(diào)節(jié)該參數(shù)可以加快算法的速度。
17. reg_lambda: L2正則化,調(diào)節(jié)該參數(shù)可以減少過擬合,默認(rèn)值為1.
18. scale_pos_weight: 正樣本的權(quán)重,在二分類模型中,如果兩個(gè)分類的樣本比例失衡,可以設(shè)置該參數(shù),模型效果會(huì)更好。比如,在研究疾病組和健康對(duì)照組分類時(shí),postive:negative = 1:10,可以設(shè)置scale_pos_weight=10,來平衡樣本。
19. seed: 隨機(jī)數(shù)的種子,
20. silent: 默認(rèn)值為=0,不輸出中間過程;=1時(shí),輸出中間過程。
21. subsample: 訓(xùn)練每棵樹時(shí),子采樣的樣本比例,默認(rèn)值為1,即全部樣本用于訓(xùn)練。調(diào)節(jié)該參數(shù)可以防止過擬合。
3.10 樸素貝葉斯分類
代碼如下(示例):
from sklearn.naive_bayes import GaussianNB model=GaussianNB() model.fit(X_train, y_train)重要參數(shù)
priors:先驗(yàn)概率大小,如果沒有給定,模型則根據(jù)樣本數(shù)據(jù)自己計(jì)算(利用極大似然法)
class_prior_:每個(gè)樣本的概率
class_count:每個(gè)類別的樣本數(shù)量
theta_:每個(gè)類別中每個(gè)特征的均值
sigma_:每個(gè)類別中每個(gè)特征的方差
alpha:先驗(yàn)平滑因子,默認(rèn)等于1,當(dāng)?shù)扔?時(shí)表示拉普拉斯平滑。
fit_prior:是否去學(xué)習(xí)類的先驗(yàn)概率,默認(rèn)是True
class_prior:各個(gè)類別的先驗(yàn)概率,如果沒有指定,則模型會(huì)根據(jù)數(shù)據(jù)自動(dòng)學(xué)習(xí), 每個(gè)類別的先驗(yàn)概率相同,等于類標(biāo)記總個(gè)數(shù)N分之一。
3.11 LightGBM分類
代碼如下(示例):
# -*- coding: utf-8 -*- # author: Yu Sun import pandas as pd import lightgbm as lgb import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split params = {'task': 'train','boosting_type': 'gbdt', # GBDT算法為基礎(chǔ)'objective': 'binary', # 因?yàn)橐瓿深A(yù)測(cè)用戶是否買單行為,所以是binary,不買是0,購買是1'metric': 'auc', # 評(píng)判指標(biāo)'max_bin': 255, # 大會(huì)有更準(zhǔn)的效果,更慢的速度'learning_rate': 0.1, # 學(xué)習(xí)率'num_leaves': 64, # 大會(huì)更準(zhǔn),但可能過擬合'max_depth': -1, # 小數(shù)據(jù)集下限制最大深度可防止過擬合,小于0表示無限制'feature_fraction': 0.8, # 防止過擬合'bagging_freq': 5, # 防止過擬合'bagging_fraction': 0.8, # 防止過擬合'min_data_in_leaf': 21, # 防止過擬合'min_sum_hessian_in_leaf': 3.0, # 防止過擬合'header': True # 數(shù)據(jù)集是否帶表頭 } # 訓(xùn)練模型并預(yù)測(cè) def train_predict_model(x,y):d_x = xd_y = ytrain_X, valid_X, train_Y, valid_Y = train_test_split(d_x, d_y, test_size=0.2, random_state=2) # 將訓(xùn)練集分為訓(xùn)練集+驗(yàn)證集lgb_train = lgb.Dataset(train_X, label=train_Y)lgb_eval = lgb.Dataset(valid_X, label=valid_Y, reference=lgb_train)print("Training...")bst = lgb.train(params,lgb_train,categorical_feature=list(range(1, 17)), # 指明哪些特征的分類特征valid_sets=[lgb_eval],num_boost_round=500,early_stopping_rounds=200)print("Saving Model...")bst.save_model(model_file) # 保存模型print("Predicting...")predict_result = bst.predict(d_future_x) # 預(yù)測(cè)的結(jié)果在0-1之間,值越大代表預(yù)測(cè)用戶購買的可能性越大return predict_result # 評(píng)估選取的各特征的重要度(畫圖顯示) def plot_feature_importance(dataset, model_bst):list_feature_name = list(dataset.columns[2:])list_feature_importance = list(model_bst.feature_importance(importance_type='split', iteration=-1))dataframe_feature_importance = pd.DataFrame({'feature_name': list_feature_name, 'importance': list_feature_importance})print(dataframe_feature_importance)x = range(len(list_feature_name))plt.xticks(x, list_feature_name, rotation=90, fontsize=14)plt.plot(x, list_feature_importance)for i in x:plt.axvline(i)plt.show()if __name__ == "__main__":train_predict_model(X_trian,Y_trian)3.12 融合模型分類
代碼如下(示例):
#常用工具庫 import re import pandas as pd import numpy as np import matplotlib as mlp import matplotlib.pyplot as plt import time#算法輔助 import sklearn from sklearn.model_selection import KFold,cross_validate from sklearn.model_selection import train_test_split#算法 from sklearn.neighbors import KNeighborsClassifier as KNNC from sklearn.tree import DecisionTreeClassifier as DTC from sklearn.linear_model import LogisticRegression as LogiR from sklearn.ensemble import RandomForestClassifier as RFC from sklearn.ensemble import GradientBoostingClassifier as GBDT from sklearn.naive_bayes import GaussianNB from xgboost import XGBClassifier as XGBC import xgboost as xgb#模型融合 from sklearn.ensemble import StackingClassifier from sklearn.ensemble import VotingClassifier from sklearn.metrics import classification_report #導(dǎo)入數(shù)據(jù) sample= pd.read_csv('data//all.csv', header=None)#原始文件 X=sample.iloc[:,3:] print(X.head()) y=sample.iloc[:,2] print(y.head()) # 訓(xùn)練集 、測(cè)試集劃分 Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3)#設(shè)置集成學(xué)習(xí)器 def fusion_estima(clf):cv=KFold(n_splits=5,shuffle=True,random_state=1412)results=cross_validate(clf,Xtrain,Ytrain,cv=cv,scoring="accuracy",n_jobs=-1,return_train_score=True,verbose=False)test=clf.fit(Xtrain,Ytrain).score(Xtest,Ytest)print("集成模型")print("訓(xùn)練集打分:", results["train_score"].mean())print("交叉驗(yàn)證打分:", results["test_score"].mean())print("測(cè)試集打分:", test)#設(shè)置一個(gè)單分類器逐一訓(xùn)練的函數(shù) def in_estimators(clfs):for clf in clfs:cv = KFold(n_splits=5, shuffle=True, random_state=1412)results = cross_validate(clf[1], Xtrain, Ytrain,cv=cv, scoring="accuracy",n_jobs=-1, return_train_score=True,verbose=False)test = clf[1].fit(Xtrain, Ytrain).score(Xtest, Ytest)print(clf[0])print("訓(xùn)練集打分:",results["train_score"].mean())print("交叉驗(yàn)證打分:",results["test_score"].mean())print("測(cè)試集打分:",test)#個(gè)體學(xué)習(xí)器定義,需要什么模型在這里加 clf1=LogiR(max_iter=3000,random_state=1412,n_jobs=8) clf2=RFC(n_estimators=100,random_state=1412,n_jobs=8) clf3=GBDT(n_estimators=100,random_state=1412) clf4=XGBC(n_estimators=100,subsample=0.9,reg_alpha=100) clf5=DTC(max_depth=8,random_state=1412) clf6=KNNC(n_neighbors=10,n_jobs=8) clf7=GaussianNB() final_clf=RFC(n_estimators=100,random_state=420,n_jobs=8)estimators=[("邏輯回歸",clf1),("隨機(jī)森林",clf2),("GBC",clf3)]#在這里你可以加你想要集成的模型,例如我想要加決策樹,在后面加("決策樹",clf5) clf=StackingClassifier(estimators=estimators,final_estimator=final_clf,n_jobs=8)#用stacking方法集成,最后疊加了一層隨機(jī)森林 clf_1=VotingClassifier(estimators=estimators,voting="soft")#直接用投票法in_estimators(estimators)#訓(xùn)練你的單個(gè)模型效果 fusion_estima(clf_1)#訓(xùn)練得出你集成模型效果,投票法 fusion_estima(clf)#stacking集成4.機(jī)器學(xué)習(xí)常用聚類模型
4.1 Kmeans,DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering
代碼如下(示例):
一次羅列了,聚類就不一一寫了
from sklearn.datasets import make_circles import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import KMeans, DBSCAN, SpectralClustering, Birch, MeanShift, AgglomerativeClustering from sklearn.decomposition import PCA import pandas as pd #數(shù)據(jù)集制造 x = make_blobs(n_samples=1000, n_features=2, centers = 4, cluster_std=2.0)[0] pca = PCA(n_components=2) pca_result = pca.fit_transform(x) fig = plt.figure(figsize=(15,10))model = AgglomerativeClustering(n_clusters = 4) y_pred = model.fit_predict(x) fig.add_subplot(2,3,1) plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred) plt.title('AgglomerativeClustering')model = KMeans(n_clusters = 4, random_state=10) y_pred = model.fit_predict(x) fig.add_subplot(2,3,2) plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred) plt.title('KMeans')model = DBSCAN(eps=0.1) model.fit(x) y_pred = model.labels_ fig.add_subplot(2,3,3) plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred) plt.title('DBSCAN')model = SpectralClustering(n_clusters = 4, random_state=10) y_pred = model.fit_predict(x) fig.add_subplot(2,3,4) plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred) plt.title('SpectralClustering')model = Birch(n_clusters=4) model.fit(x) y_pred = model.labels_ fig.add_subplot(2,3,5) plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred) plt.title('Birch')model = MeanShift() model.fit(x) y_pred = model.labels_ fig.add_subplot(2,3,6) plt.scatter(pca_result[:,0], pca_result[:,1], marker='.', c=y_pred) plt.title('MeanShift')四、參數(shù)調(diào)整
通常通過學(xué)習(xí)曲線來確定某個(gè)參數(shù)的作用及其變化,在確定參數(shù)的最佳組合的保證和計(jì)算時(shí)間之間總是存在權(quán)衡。如果超參數(shù)空間(超參數(shù)個(gè)數(shù))非常大,則使用隨機(jī)搜索找到超參數(shù)的潛在組合,然后在該局部使用網(wǎng)格搜索(超參數(shù)的潛在組合)選擇最優(yōu)特征。
1.通用學(xué)習(xí)曲線
代碼如下(示例):
缺點(diǎn):沒辦法確保得到最佳的參數(shù)組合。
from sklearn.svm import LinearSVC#舉例子 from sklearn.learning_curve import learning_curve #繪制學(xué)習(xí)曲線,以確定模型的狀況 def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,train_sizes=np.linspace(.1, 1.0, 5)):"""畫出data在某模型上的learning curve.參數(shù)解釋----------estimator : 你用的分類器。title : 表格的標(biāo)題。X : 輸入的feature,numpy類型y : 輸入的target vectorylim : tuple格式的(ymin, ymax), 設(shè)定圖像中縱坐標(biāo)的最低點(diǎn)和最高點(diǎn)cv : 做cross-validation的時(shí)候,數(shù)據(jù)分成的份數(shù),其中一份作為cv集,其余n-1份作為training(默認(rèn)為3份)"""plt.figure()train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=5, n_jobs=1, train_sizes=train_sizes)train_scores_mean = np.mean(train_scores, axis=1)train_scores_std = np.std(train_scores, axis=1)test_scores_mean = np.mean(test_scores, axis=1)test_scores_std = np.std(test_scores, axis=1)plt.fill_between(train_sizes, train_scores_mean - train_scores_std,train_scores_mean + train_scores_std, alpha=0.1,color="r")plt.fill_between(train_sizes, test_scores_mean - test_scores_std,test_scores_mean + test_scores_std, alpha=0.1, color="g")plt.plot(train_sizes, train_scores_mean, 'o-', color="r",label="Training score")plt.plot(train_sizes, test_scores_mean, 'o-', color="g",label="Cross-validation score")plt.xlabel("Training examples")plt.ylabel("Score")plt.legend(loc="best")plt.grid("on")if ylim:plt.ylim(ylim)plt.title(title)plt.show() #少樣本的情況情況下繪出學(xué)習(xí)曲線 plot_learning_curve(LinearSVC(C=10.0), "LinearSVC(C=10.0)",X, y, ylim=(0.8, 1.01),train_sizes=np.linspace(.05, 0.2, 5))2.網(wǎng)格調(diào)參
代碼如下(示例):
缺點(diǎn):由于它嘗試了超參數(shù)的每一個(gè)組合,并根據(jù)交叉驗(yàn)證得分選擇了最佳組合,這使得GridsearchCV非常慢。
#以隨機(jī)森林為例,調(diào)整max_depth,criterion from sklearn.model_selection import GridSearchCV param_grid = {'max_depth':np.arange(1, 20, 1), 'criterion':['gini', 'entropy']}#寫入你的參數(shù)及范圍 rfc = RandomForestClassifier(n_estimators=39,random_state=90) GS = GridSearchCV(rfc,param_grid,cv=10)#網(wǎng)格搜索,放入你的模型及參數(shù)范圍 GS.fit(X_trian,Y_trian)#放入訓(xùn)練數(shù)據(jù) print(GS.best_params_)#顯示調(diào)整出來的最佳參數(shù) print(GS.best_score_)#返回調(diào)整好的最佳參數(shù)對(duì)應(yīng)的準(zhǔn)確率3.隨機(jī)搜索
代碼如下(示例):
缺點(diǎn):隨機(jī)搜索的問題是它不能保證給出最好的參數(shù)組合。
from sklearn.model_selection import RandomizedSearchCV knn = KNeighborsClassifier() grid_param = { 'n_neighbors' : list(range(2,11)) , 'algorithm' : ['auto','ball_tree','kd_tree','brute'] } rand_ser = RandomizedSearchCV(knn,grid_param,n_iter=10) rand_ser.fit(X_train,y_train) #best parameter combination rand_ser.best_params_ #score achieved with best parameter combination rand_ser.best_score_ #all combinations of hyperparameters rand_ser.cv_results_['params'] #average scores of cross-validation rand_ser.cv_results_['mean_test_score']4.貝葉斯搜索
代碼如下(示例):
缺點(diǎn):要在2維或3維的搜索空間中得到一個(gè)好的代理曲面需要十幾個(gè)樣本,增加搜索空間的維數(shù)需要更多的樣本。
from skopt import BayesSearchCV import warnings warnings.filterwarnings("ignore") # parameter ranges are specified by one of below from skopt.space import Real, Categorical, Integer knn = KNeighborsClassifier() #defining hyper-parameter grid grid_param = { 'n_neighbors' : list(range(2,11)) , 'algorithm' : ['auto','ball_tree','kd_tree','brute'] } #initializing Bayesian Search Bayes = BayesSearchCV(knn , grid_param , n_iter=30 , random_state=14) Bayes.fit(X_train,y_train) #best parameter combination Bayes.best_params_ #score achieved with best parameter combination Bayes.best_score_ #all combinations of hyperparameters Bayes.cv_results_['params'] #average scores of cross-validation Bayes.cv_results_['mean_test_score']五、常用繪圖
自己畫的圖太丑,推薦網(wǎng)站在線繪圖:https://echarts.apache.org/examples/en/index.html#chart-type-bar
六、參考文章
如何解決樣本不均衡問題
菜菜機(jī)器學(xué)習(xí)
Lgb模型搭建
Sklearn參數(shù)詳解—貝葉斯
決策樹③——決策樹參數(shù)介紹(分類和回歸)
機(jī)器學(xué)習(xí) 4 個(gè)常用超參數(shù)調(diào)試方法!
(參考的文章有點(diǎn)多,感謝CSDN各路大佬的分享,讓小弟受益匪淺,后面會(huì)慢慢補(bǔ)上參考文章的)
總結(jié)
以上是生活随笔為你收集整理的机器学习实用代码汇总(你想要的这里都有)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国外邮箱哪家好?好用的公司邮箱怎么申请?
- 下一篇: 机器学习中的数学——常用概率分布(一):