随机森林调参_随机森林调参实战(信用卡欺诈预测)
时间: 2023-09-04 13:09:24 浏览: 160
随机森林是一种常用的分类算法,调参对于模型的性能至关重要。下面我将介绍随机森林的调参方法,并以信用卡欺诈预测为例进行实战演练。
## 1. 读取数据
首先,我们需要读取数据并进行预处理。这里我们使用sklearn自带的信用卡欺诈数据集,进行标准化处理和划分训练集和测试集。
```python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
data = pd.read_csv('creditcard.csv')
# 标准化处理
data['Amount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1, 1))
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data.drop(['Class'], axis=1), data['Class'], test_size=0.2, random_state=42)
```
## 2. 调参方法
随机森林有很多参数需要调节,其中比较重要的参数包括:
- `n_estimators`:决策树数量
- `max_depth`:决策树深度
- `min_samples_split`:内部节点再划分所需最小样本数
- `min_samples_leaf`:叶子节点最少样本数
- `max_features`:寻找最佳划分时考虑的特征数目
下面我们将分别介绍每个参数的调参方法。
### 2.1 n_estimators
`n_estimators`是指森林中决策树的数量,一般来说,森林中决策树的数量越多,模型的性能越好,但对计算资源要求也越高。在调节其他参数之前,我们先调节`n_estimators`。
我们可以使用交叉验证的方法来选择最优的`n_estimators`。这里以`GridSearchCV`为例:
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
param_test1 = {'n_estimators': range(10, 101, 10)}
gsearch1 = GridSearchCV(estimator=RandomForestClassifier(min_samples_split=100, min_samples_leaf=20, max_depth=8, max_features='sqrt', random_state=10),
param_grid=param_test1, scoring='roc_auc', cv=5)
gsearch1.fit(X_train, y_train)
print(gsearch1.best_params_)
print(gsearch1.best_score_)
```
### 2.2 max_depth & min_samples_split
`max_depth`和`min_samples_split`都是影响决策树的剪枝过程的参数,需要一起调节。通常情况下,`max_depth`越大,模型越复杂,容易过拟合;`min_samples_split`越小,模型越复杂,容易过拟合。
我们可以先固定`n_estimators`,然后调节`max_depth`和`min_samples_split`:
```python
param_test2 = {'max_depth': range(3, 14, 2), 'min_samples_split': range(50, 201, 20)}
gsearch2 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=60, min_samples_leaf=20, max_features='sqrt', oob_score=True, random_state=10),
param_grid=param_test2, scoring='roc_auc', cv=5)
gsearch2.fit(X_train, y_train)
print(gsearch2.best_params_)
print(gsearch2.best_score_)
```
### 2.3 min_samples_leaf
`min_samples_leaf`是指叶子节点最少样本数,一般来说,`min_samples_leaf`越小,模型越容易过拟合;`min_samples_leaf`越大,模型越容易欠拟合。
我们可以先固定`n_estimators`、`max_depth`和`min_samples_split`,然后调节`min_samples_leaf`:
```python
param_test3 = {'min_samples_leaf': range(10, 60, 10)}
gsearch3 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=60, max_depth=9, min_samples_split=110, max_features='sqrt', oob_score=True, random_state=10),
param_grid=param_test3, scoring='roc_auc', cv=5)
gsearch3.fit(X_train, y_train)
print(gsearch3.best_params_)
print(gsearch3.best_score_)
```
### 2.4 max_features
`max_features`是指寻找最佳划分时考虑的特征数目,一般来说,`max_features`越小,模型越容易欠拟合;`max_features`越大,模型越容易过拟合。
我们可以先固定`n_estimators`、`max_depth`、`min_samples_split`和`min_samples_leaf`,然后调节`max_features`:
```python
param_test4 = {'max_features': range(3, 11, 2)}
gsearch4 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=60, max_depth=9, min_samples_split=110, min_samples_leaf=20, oob_score=True, random_state=10),
param_grid=param_test4, scoring='roc_auc', cv=5)
gsearch4.fit(X_train, y_train)
print(gsearch4.best_params_)
print(gsearch4.best_score_)
```
## 3. 模型训练和预测
调参完成后,我们使用最优参数训练模型并进行预测:
```python
model = RandomForestClassifier(n_estimators=60, max_depth=9, min_samples_split=110, min_samples_leaf=20, max_features=7, oob_score=True, random_state=10)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
```
## 4. 性能评估
最后,我们需要对模型的性能进行评估。这里我们使用混淆矩阵和AUC分数来评估模型的性能。
```python
from sklearn.metrics import confusion_matrix, roc_auc_score
# 混淆矩阵
confusion_matrix(y_test, y_pred)
# AUC分数
roc_auc_score(y_test, y_pred)
```
经过调参,我们得到了一个性能比较好的随机森林模型。
阅读全文