数据挖掘与kaggle实战基础

解决问题流程
1.了解场景和目标
二分类、多分类、回归

2.了解评估准则
对于任何类型的机器学习问题,我们都一定要知道如何评估结果,或者说评估指标和目的是什么。举例来说,对于不均衡的二进制分类问题,我们通常选择受试者工作特征曲线下面积(ROC AUC或简单的AUC);对于多标签或多类别的分类问题,我们通常选择分类交叉熵或多类对数损失;对于回归问题,则会选择均方差。

3.认识数据
数值型、类别型(编码)、文本型(CoutVectorizer或者TfidfVectorizer词句统计)

4.数据预处理(清洗,调权)
清洗
(1)丢掉不可信样本,异常值
(2)缺失值(若缺失适中,用新类别值填充, 若缺失值较少,用均值或众数填充)
缺失数据统计:
aa = full.isnull().sum()
aa[aa>0].sort_values(ascending=False)
(3)调权(某些样本很重要,设置高权重)
采样
(下/上)采样,正/负样本比例,若比例太小,如1:100,可以上采样,重复正样本出现次数,
(保证样本均衡) 或者将所有负样本分成10分,正样本都保留,转化成10个分类器然后vote

5.特征工程
数值型特征,当样本间的差值很大时,需要离散化,例如将电商价格分段;是否需要数据变换,如取log后体现出一个规律分布,如1,10,100,1000取log
时间性特征:间隔性:离某节日多少天;组合型:本周类发生了多少次;离散化:饭点,非饭点
统计型:开机时间超过90%用户,开机3分钟和开机1分钟都属于开机速度很慢
6.模型调参
GridSearchCV
7.模型状态分析
8.模型融合
baggingcalssifier; vote或者mean
stacking; 将很多predictor分类器的结构作为特征再输入下一层分类器,如线性回归加权平均,
Blending:
Blending与Stacking大致相同,只是Blending的主要区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集,例如10%的训练数据,第二阶段的stacker模型就基于第一阶段模型对这10%训练数据的预测值进行拟合。说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。
不同特征维度数据的空间分布

判断特征间的相关性

from sklearn.svm import LinearSVC from sklearn.learning_curve import learning_curve #绘制学习曲线,以确定模型的状况 def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, train_sizes=np.linspace( .1, 1.0, 5)): """ 画出data在某模型上的learning curve. 参数解释 ---------- estimator : 你用的分类器。 title : 表格的标题。 X : 输入的feature,numpy类型 y : 输入的target vector ylim : tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点 cv : 做cross-validation的时候,数据分成的份数,其中一份作为cv集,其余n-1份作为training(默认为3份) """ plt.figure() train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv= 5 , n_jobs= 1 , train_sizes=train_sizes) train_scores_mean = np.mean(train_scores, axis= 1 ) train_scores_std = np.std(train_scores, axis= 1 ) test_scores_mean = np.mean(test_scores, axis= 1 ) test_scores_std = np.std(test_scores, axis= 1 ) plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha= 0.1 , color= "r" ) plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha= 0.1 , color= "g" ) plt.plot(train_sizes, train_scores_mean, 'o-' , color= "r" , label= "Training score" ) plt.plot(train_sizes, test_scores_mean, 'o-' , color= "g" , label= "Cross-validation score" ) plt.xlabel( "Training examples" ) plt.ylabel( "Score" ) plt.legend(loc= "best" ) plt.grid( "on" ) if ylim: plt.ylim(ylim) plt.title(title) plt.show() #少样本的情况情况下绘出学习曲线 plot_learning_curve(LinearSVC(C= 10.0 ), "LinearSVC(C=10.0)" , X, y, ylim=( 0.8 , 1.01 ), train_sizes=np.linspace( .05 , 0.2 , 5 ))

特征的自动选择
from sklearn.feature_selection import SelectKBest, f_classif # SelectKBest(f_classif, k=2) 会根据Anova F-value选出 最好的k=2个特征

参数的自动选择
from sklearn.grid_search import GridSearchCVestm = GridSearchCV(LinearSVC(), param_grid={ "C" : [ 0.001 , 0.01 , 0.1 , 1.0 , 10.0 ]})

利用t-SNE做非线性降维,效果不错,缺点是速率较慢
from sklearn import (manifold, decomposition, random_projection) #降维 tsne = manifold.TSNE(n_components= 2 , init= 'pca' , random_state= 0 )start_time = time.time()X_tsne = tsne.fit_transform(X) #绘图 plot_embedding(X_tsne, "t-SNE embedding of the digits (time: %.3fs)" % (time.time() - start_time))



#分割数据集.
对于分类问题,分层分割;对于回归问题,k-fold分割

#模型超参数的选择

对于回归问题,可以判断训练集标签是否分布平滑,可以使用np.log1p()将其转化(正态化),使用 expm1()返回原值(仅限尝试)

qcut:给连续数据分段
map:

猜你喜欢

转载自blog.csdn.net/wangjinxile/article/details/80729354