解决问题流程
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: