目录
前言
一、封装函数
二、使用步骤
1.读入数据
2.调用函数
2.1 DecisionTree
2.2 RandomForest
2.3 AdaBoost
2.4 GradientBoosting
2.5 CatBoost
2.6 ExtraTrees
2.7 SVC
2.8 LinearSVC
2.9 xgboost
2.10 LogisticRegression
2.11 lightgbm
总结
前言
最近需要进行模型对比,验证算法好坏。
一、封装函数
封装成两个函数,一个建模时候使用初始参数,另一个采取网格调参进行建模。
其中Optimize_Params函数是需要多传入一个参数params,是取定模型之后对其进行参数优化,其格式为字典类型,后续代码会有详细展示。
def Optimize_Params(model,params , x_train, y_train,x_test,y_test):
optimized_model = GridSearchCV(estimator = model, param_grid = params, cv=10,n_jobs=-1)
optimized_model.fit(x_train, y_train)
# evalute_result = optimized_model.cv_results_['mean_test_score']
# print('每轮迭代运行结果:{0}'.format(evalute_result))
print('参数的最佳取值:{0}'.format(optimized_model.best_params_))#best_score_#查看最佳分数(此处为f1_score)
print('最佳模型得分:{0}'.format(optimized_model.best_score_))#best_params_#查看最佳参数
y_pred = optimized_model.predict(x_test)#测试集预测值
print(classification_report(y_test, y_pred))
print("\n\n")
def init_Params(model,x_train, y_train,x_test,y_test):
model.fit(x_train, y_train)
y_pred = model.predict(x_test)#测试集预测值
print(classification_report(y_test, y_pred))
print("\n\n")
二、使用步骤
1.读入数据
选取UCI数据集中Heart数据,并进行简单的处理。
from sklearn.preprocessing import LabelEncoder
D_name='target'
data = pd.read_csv("heart.csv")
data["sex"].replace("male",0,inplace=True)
data["sex"].replace("female",1,inplace=True)
data["thal"].replace("fixed defect",0,inplace=True)
data["thal"].replace("reversable defect",1,inplace=True)
data["thal"].replace("normal",2,inplace=True)
from sklearn.model_selection import train_test_split
#导入你要分的数据特征X,标签Y
x_train, x_test, y_train, y_test = train_test_split(data.drop(D_name,axis=1),data[D_name],test_size=0.3,random_state=random_state)
2.调用函数
2.1 DecisionTree
DecisionTreeClassifier 是一种基于决策树算法的分类器,可以根据不同的特征及其组合进行分类。以下是 DecisionTreeClassifier 常用的一些参数:
- criterion:特征选择准则。可以选择 "gini" 或 "entropy" 两种方法。默认是 "gini"。
- splitter:特征划分点的策略。可以选择 "best" 或 "random" 两种方式。默认是 "best"。
- max_depth:树的最大深度。默认是 None,表示无限制深度。
- min_samples_split:节点分裂所需的最小样本数。默认是2。
- min_samples_leaf:叶节点所需的最小样本数。默认是1。
- max_features:寻找最佳划分时应考虑的特征数量。可以是整数,浮点数或字符串。默认情况下,它等于所有特征数。
可以通过调用 `DecisionTreeClassifier().get_params().keys()` 方法查看所有参数的完整列表。根据你的具体任务需求,选择不同的参数进行调整,以获得更好的分类结果。常见的操作是通过网格搜索(Grid Search)或随机搜索(Random Search)技术来搜索最佳参数组合。
下面是一个简单的例子。
from sklearn.tree import DecisionTreeClassifier
# 预设各参数的不同选项值
max_depth = [2,10,50,100,200,500]
min_samples_split = [1,5,10,20]
min_samples_leaf = [1,5,10,20]
# 将各参数值以字典形式组织起来
params = {'max_depth':max_depth, 'min_samples_split':min_samples_split,
'min_samples_leaf':min_samples_leaf}
model = DecisionTreeClassifier(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.2 RandomForest
RandomForestClassifier 是一种基于决策树算法的集成学习分类器,它使用多个决策树进行训练和预测以提高预测准确率。以下是 RandomForestClassifier 常用的一些参数:
- n_estimators:随机森林中树的数量。默认是 100。
- criterion:特征选择准则。可以选择 "gini" 或 "entropy" 两种方法。默认是 "gini"。
- max_depth:每个决策树的最大深度。默认是 None,表示无限制深度。
- min_samples_split:节点分裂所需的最小样本数。默认是2。
- min_samples_leaf:叶节点所需的最小样本数。默认是1。
- max_features:寻找最佳划分时应考虑的特征数量。可以是整数,浮点数或字符串。默认情况下,它等于总特征数的平方根。
- bootstrap:是否在建立树时对数据进行自助采样。默认为 True。
- oob_score:是否计算袋装外估计(弃用样本)得分。默认为 False。
- random_state:随机种子。默认情况下,不设置该参数,意味着随机种子为 None。
可以通过调用 `RandomForestClassifier().get_params().keys()` 方法查看所有参数的完整列表。根据你的具体任务需求,选择不同的参数进行调整,以获得更好的分类结果。常见的操作是通过网格搜索(Grid Search)或随机搜索(Random Search)技术来搜索最佳参数组合。
下面是一个简单的例子
from sklearn.ensemble import RandomForestClassifier
criterion = ["gini","entropy"]
min_samples_split = [1,2,3,4,5,10,15,20]
params={'n_estimators':[10,120,500,1200],'max_depth':[5,15,30],
"criterion":criterion,"min_samples_split":min_samples_split}
model=RandomForestClassifier(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.3 AdaBoost
AdaBoost 是一种集成学习方法,它将多个弱学习器组合为一个强学习器。AdaBoost 有许多可以调整的参数,下面是常用的几个参数:
1. n_estimators:基分类器的数量。默认为50。
2. learning_rate:学习率,控制每个弱分类器对最终分类器的贡献程度。较小的学习速率有助于提高训练的稳定性和泛化性能。默认值为1.0。
3. base_estimator:AdaBoost 算法使用的基分类器,默认为决策树分类器,也可以自定义其他分类器。
4. algorithm:选择 AdaBoost 算法实现,可以选择 SAMME.R 或 SAMME。默认是 SAMME.R,它是基于对概率的预测进行加权的版本,相较于SAMME,SAMME.R 的效果更好。
5. random_state:随机种子。默认情况下,不设置该参数,意味着随机种子为 None。
这些参数可以通过对应算法的 `get_params` 方法查看可选参数及默认值,也可以通过交叉验证等方法对参数进行调优。在使用时,需要根据具体任务需求和数据情况进行选择与调整。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
max_depth = [1,3,5,10,20,50]
n_estimators = [10,100,300,500]
learning_rate = [0.01,0.05,0.1,0.2]
algorithm = ["SAMME","SAMME.R"]
params = {'n_estimators':n_estimators,'learning_rate':learning_rate,
'base_estimator__max_depth':max_depth,"algorithm":algorithm}
model = AdaBoostClassifier(base_estimator = DecisionTreeClassifier(random_state=random_state))
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.4 GradientBoosting
GradientBoostingClassifier 是一种基于决策树算法的集成学习分类器,它使用多个决策树进行训练和预测以提高预测准确率。以下是 GradientBoostingClassifier 常用的一些参数:
- learning_rate:学习率,控制每个弱分类器对最终分类器的贡献程度。较小的学习速率有助于提高训练的稳定性和泛化性能。默认值为0.1。
- n_estimators:使得所选损失函数的决策树数量。默认是100,但选择更大的数字可以提高模型性能。
- criterion:特征选择准则。可以选择 "friedman_mse"、"mse" 或 "mae" 三种方法,默认是 "friedman_mse"。
- max_depth:决策树的最大深度。默认是3 。较大的深度通常表示更强的复杂性并且需要更长的时间来训练。
- min_samples_split:内部节点分裂所需的最小样本数。默认是2。
- min_samples_leaf:叶节点所需的最小样本数。默认是1。
- subsample:用于拟合单个基本估计量的子样本比例。默认是1.0。可以设置较小的值以使模型更加鲁棒。
- max_features:候选特征的最大数量。可以是整数,浮点数或者字符串 "auto"、"sqrt" 或 "log2",或者设置为 None(与 "sqrt" 相同)。默认情况下,它等于总特征数的平方根。
- random_state:随机种子。默认情况下,不设置该参数,意味着随机种子为 None。
可以通过调用 `GradientBoostingClassifier().get_params().keys()` 方法查看所有参数的完整列表。根据你的具体任务需求,选择不同的参数进行调整,以获得更好的分类结果。常见的操作是通过网格搜索(Grid Search)或随机搜索(Random Search)技术来搜索最佳参数组合。
from sklearn.ensemble import GradientBoostingClassifier
max_depth = [1,5,10]
n_estimators = [10,50,100,300,500]
min_samples_split=[1,5,10]
learning_rate= np.arange(0.1, 1, 0.2)
min_samples_leaf=[1,5,10]
params = {'learning_rate':learning_rate,'n_estimators':n_estimators,'max_depth':max_depth,
"min_samples_split":min_samples_split,"min_samples_leaf":min_samples_leaf}
model = GradientBoostingClassifier(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.5 CatBoost
CatBoost 是一种基于梯度提升树的机器学习算法,它可以自动处理分类特征并进行高效的训练。CatBoost 有许多可以调整的参数,下面是一些常用的参数:
1. iterations:树的数量。树的数量越多,模型就越复杂,可能会出现过拟合的情况。默认值为1000。
2. learning_rate:学习率,控制每个弱分类器对最终分类器的影响程度。较小的学习速率可以提高模型的鲁棒性和泛化性能,但是会使模型收敛速度变慢。默认值为0.03。
3. depth:树的深度。树的深度越大,模型就越复杂,容易发生过拟合。默认值为6。
4. l2_leaf_reg:L2 正则化系数。L2 正则化可以有效地防止过拟合,但如果设置得太高,则可能会导致欠拟合。默认值为3。
5. loss_function:损失函数。CatBoost 支持多种损失函数,比如对数似然函数(Logloss)、平均绝对误差(MAE)和均方误差(MSE)等。默认值为 Logloss。
6. eval_metric:评估指标。用于测量模型性能的指标,如错误率、精度和 AUC 等。默认值为 Logloss。
7. cat_features:分类特征的列索引列表。CatBoost 能够自动处理分类特征,但是如果你已经知道哪些特征是分类特征,可以将这些特征的列索引指定为 cat_features 参数,以提高模型的准确性。
这些参数可以通过对应算法的 `get_params` 方法查看可选参数及默认值,也可以通过交叉验证等方法对参数进行调参。在使用时,需要根据具体任务需求和数据情况进行选择与调整。
from catboost import Pool, CatBoostClassifier
iterations = [100,500,800]
depth=[1,2,3,4,5,10,20,30]
learning_rate= np.arange(0.1, 1, 0.1)
l2_leaf_reg=[1,2,3,4,5,10,20,30]
params = {'learning_rate':learning_rate,'depth':depth,'iterations':iterations,'l2_leaf_reg':l2_leaf_reg}
model = CatBoostClassifier(loss_function='Logloss',random_state=random_state,verbose=False,)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
这里可以看到,调参后效果没有初始参数的效果好。所以启发我们可以再调参数的时候把初始参数也放进去params中,或者将可调参数个数与范围都扩大,寻出相对最优参数 。
2.6 ExtraTrees
ExtraTreesClassifier() 是一个分类算法模型,它具有以下一些常用参数:
- n_estimators:决策树的数量,默认为100。
- criterion:衡量分裂质量的指标。支持 "gini" 和 "entropy" 两种方式,默认是 "gini"。
- max_depth:决策树的最大深度。如果不指定,则默认不设置最大深度。
- min_samples_split:拆分内部节点所需的最小样本数。小于此值的内部节点将不再分裂。默认是2。
- min_samples_leaf:叶节点最少包含的样本数。默认是1。
- max_features:寻找最佳分割时要考虑的功能数量。可以是整数、浮点数或字符串。如果是整数,则将考虑max_features个特性;如果是浮点数,则考虑max_features*N个特征,其中N是特征总数。如果是 "sqrt" 或 "auto",则max_features = sqrt(n_features); 如果是 "log2" 则 max_features = log2(n_features)。默认是 "auto",它等同于 "sqrt"。
- bootstrap:是否在构建树时使用自举样本。默认是 False,即不使用。
- random_state:随机种子。如果指定了这个数字,则每次运行对于给定的数据集都会得到相同的结果。
- n_jobs:并行计算的数量。-1 表示所有可用的 CPU。默认是 None,表示只使用一个 CPU。
你可以通过调用 `ExtraTreesClassifier().get_params().keys()` 查看所有参数的完整列表。
from sklearn.ensemble import ExtraTreesClassifier
n_estimators= [10,100,300,500]
criterion = ["gini", "entropy"]
min_samples_leaf = [1,5,10]
max_depth = [1,5,10,20,50]
params = {'n_estimators':n_estimators,
"criterion":criterion,
"min_samples_leaf":min_samples_leaf,
"max_depth":max_depth}
model = ExtraTreesClassifier(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.7 SVC
SVM (Support Vector Machine) 是一种常见的分类算法,而 SVC (Support Vector Classifier) 是 SVM 在分类问题上的具体实现。以下是 SVC 常用的一些参数:
- C:正则化参数。它越小,正则化的强度就越强。默认值为1.0。
- kernel:核函数类型。可以选择 "linear"、"poly"、"rbf"、"sigmoid" 四种方式,默认是 "rbf" 核函数。
- degree:核函数的次数(如果使用多项式核函数)。默认是3。
- gamma:核函数的系数(如果使用 rbf、poly 或 sigmoid 核函数)。默认是 "scale",可以选择 "auto" 或任何数字。
- coef0:核函数中独立项的系数。只有在使用 "poly" 和 "sigmoid" 核函数时才需设置。默认值为0.0。
- shrinking:是否使用缩放启发式算法来加速训练。默认为 True。
- tol:停止拟合的容忍度。表示如果两次迭代之间的差异小于 tol,则认为算法已经收敛。默认值为1e-4。
- probability:是否启用概率估计。默认为 False,不启用概率估计。
- class_weight:每个类别的权重。可以是 "balanced" 权重,也可以使用字典或数组自定义权重。默认情况下,所有类别的权重都是相等的。
你可以通过调用 `SVC().get_params().keys()` 方法查看所有参数的完整列表。根据你的具体任务需求,选择不同的参数进行调整,以获得更好的分类结果。常见的操作是通过网格搜索(Grid Search)或随机搜索(Random Search)技术来搜索最佳参数组合。
from sklearn.svm import SVC
kernel=['rbf','linear','poly','sigmoid']
C=[0.1,0.5,1,2,5]
probability = [True,False]
tol = [1e-3,1e-5,1e-10]
params = {'kernel':kernel,'C':C,"probability":probability,"tol":tol}
model = SVC(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.8 LinearSVC
LinearSVC 是一个支持向量机分类算法的实现,它具有以下一些常用参数可供调整:
- C:正则化参数。它越小,正则化的强度就越强。默认值为1.0。
- loss:损失函数。可以是 "hinge" 或 "squared_hinge" 两种方式,默认是 "squared_hinge"。
- penalty:正则化选项。可以选择 "l1" 或 "l2" 正则化,或者将其设置为 "None" 不使用正则化。默认是 "l2" 正则化。
- dual:是否使用对偶形式。如果样本数量>特征数量,则选择 False;如果样本数量<特征数量,则选择 True。默认是 True。
- tol:停止拟合的容忍度。表示如果两次迭代之间的差异小于 tol,则认为算法已经收敛。默认值为1e-4。
- multi_class:多类分类中选择损失函数的方式。可以选择 "ovr" 或 "crammer_singer" 两种方法。默认是 "ovr",表示一对多方法。
- fit_intercept:是否应该计算截距。默认是 True。
- intercept_scaling:插入项的缩放大小。默认是 1。
- class_weight:每个类别的权重。可以是 "balanced" 权重,也可以使用字典或数组自定义权重。默认情况下,所有类别的权重都是相等的。
你可以通过调用 `LinearSVC().get_params().keys()` 方法查看所有参数的完整列表。根据你的具体任务需求,选择不同的参数进行调整,以获得更好的分类结果。
from sklearn.svm import LinearSVC
loss = ["hinge","squared_hinge"]
C=[0.01,1,10,100]
params = {"C":C,"loss":loss}
model =LinearSVC(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
这里也是一样的,调参后效果没有初始参数的效果好。可调参数个数与范围都扩大,寻出相对最优参数 。
2.9 xgboost
XGBoost 是一种基于梯度提升决策树的机器学习算法,它通过优化树模型的结构和分裂点来提高模型性能。XGBoost 有许多可以调整的参数,下面是一些常用的参数:
1. max_depth:树的最大深度。树的深度越大,模型就越复杂,可能会出现过拟合的情况。默认值为6。
2. learning_rate:学习率,控制每个弱分类器对最终分类器的影响程度。较小的学习速率可以提高模型的鲁棒性和泛化性能,但是会使模型收敛速度变慢。默认值为0.1。
3. n_estimators:树的数量。树的数量越多,模型就越复杂,可能会出现过拟合的情况。默认值为100。
4. subsample:子采样率。随机选择部分训练数据以加速学习和减少过拟合的风险。默认值为1,表示不进行采样。
5. colsample_bytree:列采样率。随机选择特征子集以加速学习和减少过拟合的风险。默认值为1,表示不进行采样。
6. reg_alpha:L1 正则化系数。L1 正则化可以有效地防止过拟合,但如果设置得太高,则可能会导致欠拟合。默认值为0。
7. reg_lambda:L2 正则化系数。L2 正则化可以有效地防止过拟合,但如果设置得太高,则可能会导致欠拟合。默认值为1。
8. gamma:分裂阈值的最小增益。控制树的复杂度和叶子节点的数量。默认值为0,表示无限制。
这些参数可以通过对应算法的 `get_params` 方法查看可选参数及默认值,也可以通过交叉验证等方法对参数进行调参。在使用时,需要根据具体任务需求和数据情况进行选择与调整。
import xgboost as xgb
subsample= np.linspace(0.1,1,10)
learning_rate = [0.01,0.1,0.2,0.001,1]
n_estimators = [10,100,500]
max_depth = [3,10,20]
params = {'learning_rate':learning_rate,'n_estimators':n_estimators,\
'max_depth':max_depth,'subsample':subsample}
other_params = {'booster': 'gbtree',
'objective': 'reg:linear',
'colsample_bytree': 0.85,
'eta': 0.05,
'seed': random_state,
'eval_metric': 'rmse'}
model=xgb.XGBClassifier(**other_params)#选择邻近的5个点
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.10 LogisticRegression
逻辑回归是一种经典的分类算法,它基于最大似然估计来构建模型,可以通过优化损失函数来进行训练。逻辑回归模型的参数通常比较简单,下面是一些常用的参数:
1. penalty:正则化项。逻辑回归模型支持 L1 正则化和 L2 正则化,分别由参数 "l1" 和 "l2" 控制。正则化可以有效地防止过拟合,提高模型的准确性。
2. C:正则化系数。C 值越小,正则化的强度越大。C 值越大,正则化的强度越小,模型的复杂度也会增加。调整 C 值可以控制模型的泛化能力和鲁棒性。
3. solver:优化算法。逻辑回归模型支持多种优化算法,如 "lbfgs"、"liblinear"、"newton-cg" 和 "sag" 等。默认值为 "lbfgs",通常情况下无需更改。
4. max_iter:最大迭代次数。当模型迭代达到最大次数时,会停止训练。默认值为100。
5. multi_class:多分类问题。当处理多分类问题时,可以使用 "ovr" 或 "multinomial" 参数。"ovr" 表示使用一对多策略进行多分类,"multinomial" 表示使用 Softmax 函数进行多分类。默认值为 "ovr"。
这些参数可以通过对应算法的 `get_params` 方法查看可选参数及默认值,也可以通过交叉验证等方法对参数进行调参。在使用时,需要根据具体任务需求和数据情况进行选择与调整。
from sklearn.linear_model import LogisticRegression
solver = ["newton-cg","lbfgs","liblinear","sag","saga"]
tol = [1e-3,1e-5,1e-10]
params = {'C':[0.01,0.1,1,5],'penalty':['l1','l2'],
"solver":solver,"tol":tol}
model = LogisticRegression(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
2.11 lightgbm
LightGBM 是一种基于梯度提升决策树的机器学习算法,它通过优化树模型的结构和分裂点来提高模型性能。LightGBM 有许多可以调整的参数,下面是一些常用的参数:
1. num_leaves:叶子节点的数量。树的深度由 num_leaves 控制。num_leaves 越大,模型就越复杂,可能会出现过拟合的情况。默认值为31。
2. learning_rate:学习率,控制每个弱分类器对最终分类器的影响程度。较小的学习速率可以提高模型的鲁棒性和泛化性能,但是会使模型收敛速度变慢。默认值为0.1。
3. n_estimators:树的数量。树的数量越多,模型就越复杂,可能会出现过拟合的情况。默认值为100。
4. subsample:子采样率。随机选择部分训练数据以加速学习和减少过拟合的风险。默认值为1,表示不进行采样。
5. colsample_bytree:列采样率。随机选择特征子集以加速学习和减少过拟合的风险。默认值为1,表示不进行采样。
6. reg_alpha:L1 正则化系数。L1 正则化可以有效地防止过拟合,但如果设置得太高,则可能会导致欠拟合。默认值为0。
7. reg_lambda:L2 正则化系数。L2 正则化可以有效地防止过拟合,但如果设置得太高,则可能会导致欠拟合。默认值为1。
8. min_child_samples:每个叶子节点需要的最小样本数。当一个叶子节点的样本数小于 min_child_samples 时,停止分裂。默认值为20。
9. max_depth:树的最大深度。树的深度越大,模型就越复杂,可能会出现过拟合的情况。默认值为-1,表示不限制深度。
这些参数可以通过对应算法的 `get_params` 方法查看可选参数及默认值,也可以通过交叉验证等方法对参数进行调参。在使用时,需要根据具体任务需求和数据情况进行选择与调整。
import lightgbm as lgb
boosting_type = ["gbdt","dart","goss"]
params = {'learning_rate': np.arange(0.1,1,0.1), 'max_depth':[10,100,300,500,1000] ,
'n_estimators':[10,100,300,500,1000],"boosting_type":boosting_type}
model = lgb.LGBMClassifier(random_state=random_state)
init_Params(model,x_train, y_train,x_test,y_test)
Optimize_Params(model,params , x_train, y_train,x_test,y_test)
总结
针对每种模型,都有他们对应的参数可以进行调整,我们如果有足够的算力的话,可以考虑的参数个数多点,参数值范围广一点。
如果我们考虑的参数受到限制的话,甚至可能效果是会比初始参数的效果要差一些,毕竟网格搜索就是更多的网格(参数)会搜索更好的结果。
其实我们在建模之前,不妨先对数据进行处理,可以挑选有效特征列(属性),这样的话,能够使得用较少的属性,获取更大的指标值(accuracy,f1等等)。
读者不妨可参考模糊粗糙集知识。对数据集筛选,进行属性约简。