1.lambda x#首先将玩家注册日期提取出来作为单独一列
RegisterDate = data.loc[:,"玩家注册时间"].apply(lambda x: x[:10])
#单个参数的x.apply(lambda x:x[:10]) 取出x的前10个字符
2.groupby(列) 与sql用法一样 对列分组 聚合计算
#按照玩家注册日期对付费金额进行分组聚合平均计算
RegisterDateMean = data["付费金额"].groupby(RegisterDate).mean()
3.#RegisterWeekDayMean = data["付费金额"].groupby(RegisterWeekday).mean()
数据通过groupby后会生成一列索引 index 各分组 values 各分组聚合计算值
plt.bar(RegisterWeekDayMean.index, RegisterWeekDayMean.values)
#plt.bar(X,Y) #生成柱状图
4. 两列数据的dataframe.corr() 可以计算两列数据相关性
5.data.insert(data.shape[1]-1,"玩家注册时刻",RegisterTime)
#三个参数分别是插入列位置 插入列的名称 ,插入列的数据
Dataframe.insert(loc, column, value, allow_duplicates=False): 在Dataframe的指定列中插入数据。
参数介绍:
loc: int型,表示第几列;若在第一列插入数据,则 loc=0
column: 给插入的列取名,如 column='新的一列'
value:数字,array,series等都可(可自己尝试)
allow_duplicates: 是否允许列名重复,选择Ture表示允许新的列名与已存在的列名重复。
6.分割训练集 测试集后 数据的索引会乱 要养成恢复索引的好习惯
#分割完毕后需要恢复索引
for i in [Xtrain,Xtest]:
i.index = range(i.shape[0])
7. np.sqrt(MSE(Ytest,y_pred)) np.sqrt() 开根号
8.在之前众多业务模式分析当中,我们已经对SLG游戏的业务以及游戏本身有了很多的了解。现在我们可以基于这些了解来构筑新的特征。在对算法进行建模时,我们经常使用以下方式对现有特征进行重组,来生成新特征:
- 1. 特征之间**加减乘除**
- 2. 对特征进行简单**数学运算**(绝对值,取对数)
- 3. 对特征进行**逻辑运算**(and, or, 并集,交集,最大值,最小值)
- 4. 对特征进行**聚合运算**(按照离散特征聚合后取中位数、均值、众数、标准差、方差、频数)
- 5. 对特征使用**多项式**拓展方法(即特征与自身、与其他特征相乘)
- 6. 对连续特征进行**分箱**
- 7. 对离散特征进行**独热编码**
9. X.loc[X[newfeature].isnull(),newfeature] = 0 #将所有的空值,变为0
X[newfeature].isnull() 返回布尔索引
X.loc[X[newfeature] == float("inf"),newfeature] = 0 #分母很小的这样的情况
float("inf") float("-inf") 无穷大 无穷小
10. 新的特征标注方法
#高价值玩家,符合条件的被标注为1
X["潜力玩家"] = (X["付费金额"] >= 5.98).astype(int)
(X["付费金额"] >= 5.98) 布尔索引 返回行索引和 True False
布尔索引+astype(int) 可以实现 0 1 二值化 符合条件为1
#低价值玩家,符合条件的被标注为0 .apply(lanbda x :not x )
X["肝帝玩家"] = (X["在线时长"] > 800).apply(lambda x: not x).astype(int)
11.数据预处理规则:
为了数据能够有效在线性回归中运行,我们希望能够避免异常值、偏左分布等因子带来的影响。因此,我们希望对训练集做出以下预处理:
> 1. 相关性分析:我们可以删除与标签相关性不足或为0的特征,并观察哪些特征与标签有关联
> 2. 训练/测试比例调优:调整训练集测试集比例,找出最佳的test_size超参数
> 3. 异常值处理:按照箱线图的规则,对异常值中7日内无氪金的玩家进行中位数覆盖处理,对于7日内有氪金的玩家不处理
> 4. 数据归一化:为排除量纲不统一问题带来的困扰,同时在大数据量情况下加速计算速度,我们需将所有特征属性归一化到[0,1]范围内
> 5. 数据正态化(可选):从统计学角度来看,正态化的特征数据更有可能拟合出优秀的结果,我们可以试试box-cox正态化后数据的结果
12.ERROR1 corr()不显示的原因 :数据两列都必须为数值型
解决方法 .astype(float)
13.corr_list.sort_values("相关系数",ascending=False).head()
#sort_values("列名",ascending = False) 默认升序 =True
14.import warnings #消除警告的代码 报红很烦人时候用
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
15. 模型融合:处理极度偏态的数据带来的问题
回归问题中 可以考虑这样一种思路:先用逻辑回归进行分类,氪金与否 预测不氪金的用户回归值为0 再对很有可能氪金的用户进行回归 可以提升模型的效果。
我们让逻辑回归先对用户进行“氪与不氪”的预测,然后将逻辑回归认为会氪的用户放入线性回归,再让线性回归直接对“本来就很可能会氪金”的用户进行氪金金额预测。我们认为这样的方式经过适当调整后,应该能够提升模型表现。
16.#测试集的拟合情况
y2_proba = clf.predict_proba(Xtest)
y2_proba[:,1]#提取出为1的概率
ROC(Ytest2,y2_proba[:,1]) #ROC() 参数为 真实值 + 预测为1的概率值
17.format()
print("{:.3f} Recall:{:.3f}".format(tol,recall))
#再次复习 {:.3f}.format(变量) :.3f 保留三位小数
加餐 集成学习 GBDT XGBOOST LIGHTGBM
18.集成算法的学习率是调参的重点
一个样本在集成算法中的输出值总是等于这个样本在所有树上的输出值的加权平均
19.GBDT损失函数的选择: SE AE Huber或者Quantileloss 依据业务需求来定:
当业务高度关注离群值时,选取 SE 扩大离群值对模型的影响
当业务试图排除离群值的影响时,选取AE
当业务试图平衡离群值和非离群值时,选取Huber或者Quantileloss
20.无论是lightgbm pytorch xgboost tensorflow 都需要将数据进行打包再调库
21.在普通决策树、Adaboost、GBDT当中,我们是基于不纯度指标的下降量进行分枝,在xgboost当中我们是基于结构分数相关的技术进行分枝,在lgbm当中,我们使用特征或样本的直方图相关的计算作为指标进行分枝,并且必须在两个方向中二选一。
"force_col_wise":True #也可设置"force_row_wise":True
22.y_pred = reg.predict(X) #注意,lgbm的预测方法predict不接受lgbm自己的Dataset类输出的数据,这里需要输入原始数据特征矩阵X
23.LGBM在使用交叉验证时 lgb.cv()中要额外输入 nfold 交叉验证折数 seed=1412 交叉验证随机数种子 stratified=False 交叉验证回归不使用
在lgb.cv当中默认使用stratified方式进行交叉验证,对回归算法而言无意义。stratified是针对分类算法在kfold基础上进行的调整。在分类数据当中,但每个类别的样本不均匀时,stratified可以保证每份交叉验证数据中,标签的类别分布都与全数据一致。对于回归算法,stratified=True则会报警告,因为回归类算法没有标签类别可以进行分割。
param = {"seed":1412, "metric":"rmse", "force_col_wise":True}
result = lgb.cv(param, traindata, nfold=5,num_boost_round=10, seed=1412, stratified=False)
24.sklearn 和 lgbm xgboost 交叉验证返回的结果不同
sklearn 返回list 所有验证集的 RMSE
lgbm 返回字典 验证集上交叉验证均值 方差
xgboost 返回DataFrame 验证集测试集上交叉验证均值 方差
25.
xgboost作为独立于sklearn的机器学习算法库,一直有着两个美誉: 1. xgboost可以自动处理缺失值,无需进行填补 2. xgboost可以并行建树,因此计算速度很快
26.k折交叉验证的步骤
#使用k折交叉验证来建立benchmark
cv = KFold(n_splits=5,shuffle=True,random_state=1412) #5折打乱顺序的交叉验证
#准确率
clf = RFC(n_estimators=200,random_state=1412)
acc = cross_val_score(clf,Xe,y,cv=cv)
#交叉验证参数(模型(未训练的),Xe,y,cv=实例化的k折交叉验证/或交叉验证数)
27.利用groupby(分组)函数生成聚合特征
在数据挖掘竞赛中,聚合特征作用十分地明显
例如 生成支付方式的聚合异常率
train.groupby("支付方式")["异常"].mean() #每种支付方式下的异常率
或者 train.groupby("支付方式")["异常”].sum() / train.groupby("支付方式")["异常”].count()
28.独热编码不适用于决策树,而且会增加模型的维度