electriceel 0.0.1
Model electriceel for model feature metric
Requires Python: >=3
Keywords: model-electriceel,scikit-learn,model,feature,metric

## 模型算法平台
### 文件结构

#### data:数据存储

- feature_platform:特征处理
- Fill：缺失值填充
- Scale：特征标准化
- Bins：分箱
- Encoder：特征编码
#### metric_platform:评估模块
- null_rate：缺失率
- iv_score：iv值
- desc：特征描述

1. ClassificationMetric：分类模型评估
- auc_score
- ks_score
- f1_score
- precision_recall_curve：精准率和召回率曲线

2. RegressionMetric：回归模型评估
- mean_absolute_error
- mean_squared_error
- mean_squared_log_error
#### model:模型模块

1. ClassificationModel：分类模型
- lr
- xgb
- svm
- rf
- gbdt
- gbdt+lr
- rf+lr
- xgb+lr
- lgb+lr
#### util：工具模块
- load_data：加载文件数据
- prob_to_score：概率转换为分数
- save_model：模型保存
- load_model：模型加载
### 使用说明
根据electric_eel.py生成ElectricEel对象
- 特征处理
配置feature_config，调用feature_fit()函数进行特征处理，返回处理后的特征及相关信息
- 模型训练
配置train_config，调用model_train()函数，进行模型训练，该步骤的特征数据可依赖上一步特征处理后的数据，也可以自定义数据。如果配置特征重要性，会返回特征重要性
- 模型测试
调用model_test()函数，进行模型测试，该步骤依赖于上一步产生的模型，及第一步的特征处理，返回预测值以及相应的评测结果
- 模型预测
输入原始特征，依赖于第一步产生的特征处理及第二步模型训练，进行预测
- 特征输出
如果仅需要进行特征处理，则在第一步完成后，即可，调用feature_transform()输入原始特征即可输出处理后的特征  

### 配置说明
**feature_config**

```
{
    "feature": "dataframe或者filepath：训练数据,必填",
    "num_col": "list：数值型特征名列表,必填",
    "cate_col": "list：类别型特征名列表,必填",
    "target_col": "str：目标列名,选填",
    "model_type":"str：classification:分类，regression:回归,必填",
    "metric": {特征评估，必填
        "null_rate":"bool:是否计算缺失率,选填",
        "iv":"bool:是否计算IV值,选填",
        "describe":"bool:是否获取特征描述信息,选填"
    },
    "preprocessing": {特征处理，必填
        "fill": {数据填充，选填
            "method": "str:填充方式，simple：简单采样,KNN：knn算法采样填充，default:simple，选填",
            "fill_cate": "bool 类别型特征是否填充，default:True，选填",
            "fill_value": "dict 指定特征列的填充值，default:None，选填",
            "num_sample_strategy": "str  数值型填充方式，mean：平均值，median：中位数，most_frequent：频率，default:median，选填",
            "cate_sample_strategy": "str 类别型填充方式，most_frequent：频率，default:most_frequent，选填",
            "n_neighbors": "int knn采样邻居个数，default：5，选填"
        },
        "scale": {标准化，选填
            "method": "str 选择处理方式，max_abs_scaler，min_max_scaler，standard_scaler，default:standard_scaler，选填",
            "scale_col": "list 需要标准化的特征列，default：数值型特征列:，选填"
        },
        "bins": {分箱，选填
            "bin_col": "list 需要分箱的特征列，default：数值型特征列:，选填",
            "n_bins": "int or array-like of shape (n_features,), default=5，选填",
            "encode": "用来编码转换结果的方法。{‘onehot’, ‘onehot-dense’, ‘ordinal’}, default=’onehot’,选填
                        'onehot'。用one-hot编码对转换后的结果进行编码，并返回一个稀疏矩阵。忽略的特征总是向右叠加。
                        'onehot-dense'。对转换后的结果进行单热编码，并返回一个密集数组。忽略的特征总是堆积在右边。
                        'ordinal'。返回编码为整数的bin标识符。",
            "strategy": "用来定义分仓宽度的策略。{‘uniform’, ‘quantile’, ‘kmeans’}, default=’quantile’，选填
                        'uniform'。每个特征中的所有箱体都有相同的宽度。
                        ‘quantile’。每个特征中的所有分仓都有相同的点数。
                        'kmeans'。每个bin中的值都有相同的一维k-means集群的最近中心。"
        },
        "encoder": {编码，选填
            "encoder_col": "list 需要编码的特征列，default：类别型特征列，选填",
            "method": "str:one-hot or ordinal，default：one-hot:，选填"
        }
    }
}
```
**train_config**
```
{
    "algorithm": "str:模型，{'xgb','lr','svm','rf','gbdt','gbdt+lr','rf+lr','xgb+lr'，'lgb+lr'},必填",
    "feature": "dataframe：特征数据,必填",
    "target_col": "str：目标列名,选填",
    "model_type":"str：classification:分类，regression:回归,必填",
    "params": "dick：第一模型参数,必填",
    "params2":"dick：组合模型中第二模型参数,必填",
    "verbose": "bool:是否显示日志，default:True,选填",
    "feature_importance": "bool:是否计算特征重要性，default:True,选填"
}
```

### 回归测试报告
正例：1，负例：0

该报告主要针对业务人员，对模型整体效果进行说明，
该报告会对整个测试集产生的测试结果（预测概率）进行区间划分，对各个区间段的区分情况进行统计，生成如下几个指标：
- 拒绝率：低于该阈值的用户占比
- 拒绝分数：该分段的阈值
- 拒绝误判率：低于该阈值的用户中实际为正例的占比，（应该为1被判定为0）
- 通过正判率：高于该阈值的用户中实际为正例的占比，（应该为1也被判定为1）
- 分档通过率：在该分档区间（当前阈值和下一个阈值）实际是正例的占比
- 分档个数：在该区间的用户量
- 拒绝误判累计占比：低于该阈值的用户中预测为负例占实际正例的比例
- 拒绝正判累计占比：低于该阈值的用户中预测为负例占实际负例的比例
- 通过误判累计占比：高于该阈值的用户中预测为正例占实际负例的比例
- 通过正判累计占比：高于该阈值的用户中预测为正例占实际正例的比例
- K-S：拒绝正判累计占比 - 拒绝误判累计占比
- 分档通过占比：在该分档区间实际正例的占比
- 分档拒绝占比：在该分档区间实际负例的占比
- 分档通过人数：在该分档区间实际正例的用户数
- 分档拒绝人数：在该分档区间实际负例的用户数

**用例参考example.py文件**