Python
Drop Columns
函数 .drop()
# Drop some useless columns
to_drop = ['state','area_code','phone_number','churned']
churn_feat_space = churn_df.drop(to_drop, axis=1)查看数据的unbalance
看true的比重
# check the propotion of y = 1
print(y.sum() / y.shape * 100)Yes/No转换成True/False
# yes and no have to be converted to boolean values
yes_no_cols = ["intl_plan","voice_mail_plan"]
churn_feat_space[yes_no_cols] = churn_feat_space[yes_no_cols] == 'yes'Gender转换成1/0
X_train['sex'] = (X_train.sex == 'M').astype(int)Encoding Method
get_dummies()函数
在这里有各种encoding methods 最简单的其实就是.get_dummies()这个函数
drop_first: 其实是k-1个列就能表示k种情况,比如红蓝黄三种花,只需要2个column [1,0], [0,1], [0,0]
prefix : 转换后,列名的前缀
dummy_na : 增加一列表示空缺值,如果False就忽略空缺值
多个categorical feature在一列
如果一个column里一下放了好多个不同的categorical feature,想把它们提出来做encoding,这样可以提出来,画个图看一下每种里的数量
可以用两种方式做encode,然后再merge back
具体看这个链接
第二种方法更好读一点
如果有一些categorical feature实在太少,可以bin在一起,用| 或就行,或者是concat函数
如果有很多个feature(比如国家,200个),那么可以用frequency作为encoder(简易版的target encoding)。
年份的处理
如果是时间序列或者有年份的column,可以以10%~90%的percentile来bin年份为一个个bucket,最后把年份区间作为categorical feature做one-hot encoding。
用到的是cut这个函数,取前不取后
Train_Test Split
注意如果data是unbalanced,可能在split的时候没有平均的分,所以在这个函数里有一个stratify选择true
另外如果面对“Train-Test Split“, "One Hot Encode", "SMOTE"等feature engineering的选项,第一个需要做的事一定是Train Test Split, 这样才不会让model偷看到Test的数据。
Standardization/Normalization
注意如果要train-test split, 需要分别对这两个dataset做transformation 比如
fit transform 的mean和std拿到test上去用,但是不让train看到test里的值
standardization,目的是让数据在 (-1,1)(x-u)/sd, 对原始数据进行缩放处理,限制在一定的范围内。一般指正态化,即均值为0,方差为1。即使数据不符合正态分布,也可以采用这种方式方法,标准化后的数据有正有负。
normalization的目的是数据在(0,1)比如minmax scaling, (x-xmean)/(xmax-xmin)
这么做的目的是
加速gradient descent
把数据放在同一个scale里,让数据之间可以被比较,否则不同的feature会造成不同的影响
在实际做OA时一定要standardize,因为L1L2的系数,penalize的就不同 除了上面的standardscaler外,还有minmaxscalar、robustscalar
Classification Problem
Build Model and train
Cross Validation
training的那一部分,继续分成五个小的dataset,每个小的dataset都做过training也都做过testing 把train_test_split理解为分出holdout data 见下图
注意上面的结构都是用的default hyper parameter

Hyperparameter Tuning
GridSearchCV
Grid-search: 比如,在random forest里,有两个hyper parameter,分别是depth和tree number,那么grid-search就是在排列组合
Grid-searchCV: 每个组合里再cross validation,比最后的mean score
Logistic Regression Hyperparameter
C: inverse of lambda
KNN
Random Forest
还可以写个wrapper,根据不同的scorer来筛选model
比如
Optimize F1 Score on LR
Optimize F1 Score on RF
还可以把结果按照score sort了之后打印出来,precision, recall, f1等
按照feature importance排序一下
Model Evaluation
Confusion Matrix
还采用的做法是可以把cm转换成df打印出来
ROC
AUC
Feature Selection
L1
L2
就像feature selection的section所写,L1可以做feature selection,把correlation强的其中某项设置为0 而L2会把这两个做成近似的数值
Random Forest Feature Importance
注意这里的feature importance只是RF定义的importance,并不一定是物理意义上重要
Regression Problem
先用linear regression作为base model,在这里不一定非要用最简单的LR,可以直接上lasso和ridge,因为LR可以被认为是lambda=0时的lasso或者ridge。
Linear Regression
这里也涉及到调参,选择最优的lambda,可以画图来找 在下面的code中,x轴是lambda分之一的值,取值区间用了log space的150个点,因为这就能让前面的点相对密集,后面的点相对稀疏,更方便找到max(经验之谈)。
然后train
带Polynomial feature的LR
然后train
ridge也是同理
Non-Linear Model: Random Forest
最后出来的这个grid_rf下有一个非常重要的best_params_,能输出最佳的hyper parameter数值
另外,还有一个重要的结果是cv_results_下的内容,其中有一个'mean_test_score'记录了test scores,可以在图上画出来,找最高点
接下来就能根据图像找到点、重新train
Model Evaluation, score, mean squared error
Lasso, Linear
Ridge, poly
可以把这些都画在图上,直观看到最高的 不过因为只有五个点而已,画图可能不好看,表格也许更直观
Feature Importance with Random Forest
也是一样可以画图看
在上面的code block里第三行的函数argsort,是numpy中的quicksort,可以沿着axis=0(列)或者axis=1(行)排序,输出是从小到大的索引 如果想要获得从大到小,可以np.argsort(-x),或者[::-1]
第四行model_test_x.columns.get_values()可以方便地获取column的名字
Unsupervised Learning
K-means clustering
plot the result
Last updated