1 数据可视化
-
- pandas
df.head() 看前几行
df.value_counts() 看总体分布
df.info()/df.describe() 看缺失值、整体情况
df.plot(kind = 'scatter', x =column1,y = column2) 看两列散点图关联
Series.unique() 去重,将两个变量合并看他们的独立值变化情况似乎是一种很有道理的查看两个变量相关程度的方法
pd.crosstab(data. column1,data. Column2) 给出两列的交叉表,可以用于判断特征对应
-
- seaborn
sns.jointplot(x =column1,y = column2, data=df, size=6) 好看一点的散点图
sns.boxplot(x =column1,y = column2, data=df) 标签和某个特征的分布关系
sns.FacetGrid(df, hue= column_label, size=5).map(plt.scatter, column1, column2).add_legend() 在二维的曲面上表示这些点的分布(可能可以找出异常点)
sns.FacetGrid(df, hue= column_label, size=6).map(sns.kdeplot, column).add_legend() 某个连续参数值和标签的关系
sns.pairplot(df, hue=column_label, size=3) 标签和每个特征的关系
cm = df.corr()/cm = np.corrcoef(df.values.T)#这里边可以有几个方法轮流选择
plt.subplots(figsize = (12,9))
sns.heatmap(cm,vmax = 0.9,square = True) 绘制列的相关性的热力图
-
- matplotlib
2 特征工程
-
- 数据预处理
缺失值处理
直接将“缺失“作为标签
数值型特征全部填充0
众数填充df.column.mode()[0]
中位数填充 df.column.median()
多项式填充 np.polyfit
无量纲化
sklearn.preprocessing中的各个包,缩放包括中心化和归一化
二值化
sklearn.preprocessing.Binarizer设定阈值,应用于数据列获得非零即一的结果
独热编码
sklearn.preprocessing.OneHotEncoder或pandas.get_dummies,后者的应用范围似乎更广。另外如果数据量大,也可以用稀疏矩阵自己实现:
源代码参见
D:\学习\data_mining\kaggle_sample\amazonaccess-master\solution_2\helpers\feature_extraction.py
586到615行
class OneHotEncoder():
"""
OneHotEncoder takes data matrix with categorical columns and
converts it to a sparse binary matrix.
"""
def __init__(self):
self.keymap = None
def fit(self, X):
self.keymap = []
for col in X.T:
uniques = set(list(col))
self.keymap.append(dict((key, i) for i, key in enumerate(uniques)))
def transform(self, X):
if self.keymap is None:
self.fit(X)
outdat = []
for i, col in enumerate(X.T):
km = self.keymap[i]
num_labels = len(km)
spmat = sparse.lil_matrix((X.shape[0], num_labels))
for j, val in enumerate(col):
if val in km:
spmat[j, km[val]] = 1
outdat.append(spmat)
outdat = sparse.hstack(outdat).tocsr()
return outdat
2.2 特征选择
2.2.1 调包类
sklearn.feature_selection.VarianceThreshold 方差选择法,选择比较稳定的哪些特征
sklearn.feature_selection.SelectKBest选择相关性大的特征,结合pearsonr/chi2/MINE使用
sklearn.feature_selection.RFE 根据目标函数(通常是预测效果评分),每次选择若干特征
sklearn.feature_selection.SelectFromModel 根据某些模型的训练权值系数选择
2.2.2 自己动手类
见amazonaccess-master比赛中排名第一的代码的特征选择方法:用选定的算法、选定的损失函数,对特征的所有组合进行排除。这样做的好处是全面,问题是耗时长,因此需要提前进行独热编码和无用特征剔除。一些特征转换也必须在这步选择后再做并使用简单模型,否则算不动。
D:\学习\data_mining\kaggle_sample\amazonaccess-master\solution_2\BSMan\logistic.py
第273到307行
2.4 特征生成/转换
sklearn.preprocessing.PolynomialFeatures列间关系 多项式转换(也可以自己做一些计算)
FunctionTransformer(log1p).fit_transform(iris.data) 列内关系 取对数(也可以替代成别的函数)
其他思路:取平方、取平均、取对数、算频率、获得矩阵中每列的值和其他列值的对应等
sklearn.preprocessing.LabelEncoder() 特征编码
• 关注一些地位特殊的特征,考察其他每个特征中的值和它同时出现的比例/条件概率,并分析这些联合的意义
• 分桶和二值化时可以先关注一下这个特征和标签的对应关系分布
• 连接两个/三个/更多数据,并对它们进行哈希编码和特征编码,写法参见见amazonaccess-master比赛中排名第一的代码的group_data方法
D:\学习\data_mining\kaggle_sample\amazonaccess-master\solution_2\BSMan\ensemble.py
第36到54行
• 将稀有特征合并到一个或多个特征里
2.3 降维
sklearn.decomposition.PCA 主成分分析降维
sklearn.lda.LDA 线性判别分析降维
- 算法训练
3.1常用算法
xgboost,RandomForestClassifier, ExtraTreesClassifier, GradientBoostingClassifier
3.2 损失/目标函数
二元分类:auc/roc
其他:视情况而定,不一定非要用正确率
3.3 调参方法
0. XGBoost调参指南【源https://dnc1994.com/2016/04/rank-10-percent-in-first-kaggle-competition/】
- Random Forest 一般在 max_features 设为 Feature 数量的平方根附近得到最佳结果。
- 常见算法可能参数取值,可做参考
- grid_search(标红表示它很重要)
可以直接使用grid_searchCV,用交叉验证集给出搜索结果,用法参见D:\学习\data_mining\kaggle_sample\amazonaccess-master\solution_2\helpers\ml.py
- hyperopt 运行速度更快,但较为难用,用法参见https://mlwave.com/kaggle-ensembling-guide/
- 算法优化
4.1 欠拟合和过拟合
scikit-learn.learning_curve 绘制学习率曲线
例程参照https://blog.csdn.net/weixin_39655021/article/details/86612648 384-433行
4.2 模型融合
stacking:可以自己写,也可以参见D:\学习\data_mining\kaggle_sample\amazonaccess-master\solution_2\helpers\ml.py,写的非常好,里面的模型选择也值得一看
简单平均
结果投票
5 其他
- train和test用同一个fit
- 中间结果不断输出到硬盘,合理命名,代码模块化,防止重复运行
P.S.之前看了很多东西,收获匪浅,但是也线头杂乱,所以告一段落之前略作总结。现在觉得,所有的函数写法、调包语法都不是那么重要,都可以现查,重要的是经验和能力所带来的面对数据应有的敏感度、特征工程中的业务知识、面对杂乱数据的耐心和想法。
之前数据处理的经验比较丰富,而数据挖掘这方面,一直在看别人的代码,也可以说是霜刃未曾试,在坑队友之前,先单枪匹马去水一个比赛试试。先定一个小目标,kaggle初战进前25%~
会继续总结,加油