一、 流程总结
- 导入相关模块
- 数值计算库 pandas numpy
- 绘图库 matplatlib seaborn
- 机器学习库 sklearn
- 数据基本处理
- 获取数据、查看数据基本信息及分布
- 确定特征值、目标值
- 缺失值处理
- 数据规范化处理、异常值处理
- 数据集划分(留取法、交叉验证)
- 特征工程
- 特征提取(字典、文本、图像)
- 特征预处理(归一化、标准化)
- 特征降维(特称选取、相关性分析、PCA)
- 机器学习
- 模型选择
- 普通模型
- 集成模型(RF、XGBoost、lightGBM)
- 参数调优
- 网格搜索
- 随机搜索
- 贝叶斯优化
- 模型选择
- 模型评估
- 回归
- score得分(R2系数)
- MAE 平均绝对误差
- RMSE 均方根误差
- 分类
- 准确率
- 精确率、召回率、F1 score
- ROC曲线
- AUC
- PR曲线
- logloss
- 获取最优模型
- 回归
- 模型预测与导出
二、详细介绍
1. 导入相关模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
2. 数据基本处理
2.1 获取数据及数据查看
# 读取csv
data = pd.read_csv("./data/train.csv")
# 查看头/尾
data.head()
data.tail()
# 查看各列最大、最小、平均值等信息
data.describe()
# 查看列基本信息(类型,多少非null值)
data.info()
# 查看行列信息
data.shape
# 查看去重数量
np.unique(data['row1']).shape
# 查看各个标签的样本个数(即分布信息)
from collections import Counter
Counter(data['target'])
# 图形可视化,查看数据分布
import seaborn as sns
plt.figure(figsize=(10,6))
sns.countplot(data['target'])
plt.show()
# 采样(这里需要先安装Imblearn , pip3 install imbalanced-learn )
from imblearn.over_sampling import RandomOverSampler,SMOTE
from imblearn.under_sampling import RandomUnderSampler
# 随机过采样
smo = SMOTE(random_state=0)
X_resampled, y_resampled = smo.fit_resample(X, y)
# 欠采样
rus = RandomUnderSampler(random_state=22)
X_resampled, y_resampled = rus.fit_resample(X, y)
# 合并表格
t = pd.merge(t1,t2,on=['col1','col2'])
# 交叉表合并(查看两列之间的关系)
t = pd.crosstab(table3['user_id'], table3['aisle'])
# 数据截取
data = data[:1000]
2.2 数据基本处理
# None替换特殊符号
data = data.replace(to_replace='?', value=np.nan)
# 均值填充
data["age"].fillna(data["age"].mean(),inplace=True)
# 删除None
data = data.dropna()
# 确定特征值和目标值
x = data.iloc[:,1:10]
y = data['Class']
# 数据集划分
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x, y, random_state=0, test_size=0.2)
# 采用交叉验证
folder = KFold(n_splits = 4, random_state=0, shuffle = False)
for train, test in folder.split(X, y):
print('train:%s | test:%s' %(train, test))
print("")
# 分层采样,确保训练集,测试集中,各类别样本的比例是和原始数据集中的一致。
sfolder = StratifiedKFold(n_splits = 4, random_state = 0, shuffle = False)
for train, test in sfolder.split(X, y):
print('train:%s | test:%s'%(train, test))
print("")
# 把标签值转为数字
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_res = le.fit_transform(y_res)
3 特征工程
# 特征提取
## 字典特征提取
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
# 独热编码(适合分类值较少的特征)
train['matchType'].unique()
train = pd.get_dummies(train, columns=['matchType'])
# 文本特征(参考:特征工程-〉特征提取)
# 特征降维
transfer = PCA(n_components=0.9)
data = transfer.fit_transform(table)
4. 机器学习
# 参数调优
# 网格搜索
from sklearn.model_selection import GridSearchCV
estimator = lgb.LGBMRegressor(num_leaves=31)
param_grid = {
'learning_rate': [0.01, 0.1, 1],
'n_estimators': [20, 40, 60, 100, 200, 300]
}
gbm = GridSearchCV(estimator, param_grid, cv=5, n_jobs=-1)
gbm.fit(X_train, y_train)
# 最优参数
print("在交叉验证中验证的最好结果:\n", estimator.best_score_)
print("最好的参数模型:\n", estimator.best_estimator_)
print("每次交叉验证后的验证集准确率结果和训练集准确率结果:\n",estimator.cv_results_)
5. 模型评估
# 平均绝对误差
from sklearn.metrics import mean_absolute_error
y_pred = gbm.predict(X_valid)
mean_absolute_error(y_valid, y_pred)
# score得分(R2系数)
y_pre = m2.predict(X_valid)
m2.score(X_valid, y_valid)
# logloss(用于分类问题)
from sklearn.metrics import log_loss
y_pre_prob = rf3.predict_proba(x_test)
log_loss(y_test, y_pre_prob)
6. 模型导出
# 保存模型
from sklearn.externals import joblib
joblib.dump(model, './test.pkl')
# 加载模型
estimator = joblib.load(‘test.pkl’)