建模方法流程

确定建模的目标:是分类问题还是回归问题或是无监督学习问题
对数据进行分析
数据挖掘之特征工程
  • 特征:数据中抽取出来的对结果预测有用的信息
  • 特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法中发挥更好作用的过程
特征工程的意义
  • 更好的特征意味着更好的结果
  • 模型的特征决定模型效果的下限
  • 更好的特征意味着只需要更简单的模型
数据采集
  • 哪些数据对最后的结果预测有帮助
  • 线上实时计算的时候获取是否快捷
数据清洗
  • 算法大多数时候就是一个加工机器,至于最后的产品如何,取决于原材料的好坏
  • 数据清洗做的事情 ==》去掉脏数据
数据采样
  • 很多情况下,正负样本是不均衡的
  • 大多数模型对正负样本比是敏感的
  • 随机采样 和分层采样
正负样本不均衡处理办法
  • 正样本 >> 负样本,且量都挺大 =》下采样
  • 正样本 >> 负样本,量不大 =>
    • 采集更多的数据
    • 修改损失函数(对负样本误分类加重损失值)
特征处理
  • 数值型
  • 类别型
  • 时间型
  • 文本型
  • 统计型
  • 组合特征
特征处理之数值型
  • 幅度调整/归一化
  • Log 变换
  • 统计值 max,min,mean,std
  • 离散化
  • hash分桶
  • 数值型 =》 类别型
特征处理之类别型
  • one-hot 编码
特征处理之时间型
  • 连续值
    • a) 持续时间
    • b) 间隔时间
  • 离散值
    • a) 一天中哪个时间段
    • b) 一周中的星期几
    • c) 一年中的哪个星期
    • d) 工作日/周末

特征选择

特征选择主要有两个功能:

  • 1、减少特征数量、降维,使得模型泛化能力更强,减少过拟合
  • 2、增强对特征和特征值之间的理解
单变量特征选择

       单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。对于回归和分类问题可以采用卡方检验等方式对特征进行测试

  • Pearson相关系数
           Pearson Correlation 衡量变量之间的线性相关性,结果的取值区间为[-1,1]
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size = 300
x = np.random.normal(0, 1, size)
print "Lower noise", pearsonr(x, x + np.random.normal(0, 1, size))
print "Higher noise", pearsonr(x, x + np.random.normal(0, 10, size))

当噪声数据较小的时候,相关性很强,p-value很低。
但是Pearson相关系数的一个明显缺陷是,它只对线性关系敏感,如果关系是非线性的,即便两个变量具有一一对应的关系,相关性也可能会接近0

x = np.random.uniform(-1, 1, 100000)
print pearsonr(x, x**2)[0]
  • 互信息和最大信息系数

Mutual Information,缩写为MI,表示两个变量X与Y是否有关系,以及关系的强弱,互信息的公式:

百科介绍:

image

  • 距离相关系数

           距离相关系数是主要是为了克服Pearson 相关系数的弱点,及时Pearson相关系数是0, 我们也不能断定这两个变量是独立的;但是如果距离相关系数是0, 那么我们就可以说这两个变量是独立的。

  • 基于学习模型的特征排序

           直接使用算法,针对每个单独的特征和响应变量建立预测模型,Pearson相关系数等价于线性回归里标准化回归系数。假如某个特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。基于树的方法比较易于使用,因为他们对非线性的关系建模比较好,并且不需要进行太多的调试,但是要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证。

使用随机森林对单变量进行选择:

from sklearn.cross_validation import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor

#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]

rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
for i in range(X.shape[1]):
     score = cross_val_score(rf, X[:, i:i+1], Y, scoring="r2",
                              cv=ShuffleSplit(len(X), 3, .3))
     scores.append((round(np.mean(score), 3), names[i]))
print sorted(scores, reverse=True)
  • 线性模型

           单变量特征选择方法独立的衡量每个特征与相应变量之间的关系。另一种主流的特征选择方法是基于机器学习模型的方法,有些机器学习方法本身就具有对特征进行打分的机制,或者很容易将其运用到特征选择任务中,,例如回归模型,SVM,决策树,随机森林等

           利用回归模型的系数进行特征的选择。越是重要的特征在模型中对应的系数就会越大,在噪声不多的数据上,或者是数据量远远大于特征数的数据上,如果特征之间相对来说是比较独立的,那么即便运用最简单的线性回归模型也一样能取得非常好的效果

正则化:

       正则化就是把额外的约束或者惩罚项加到已有模型损失函数上,以防止过拟合并提高泛化能力。当用线性模型上时,L1正则化和L2正则化也称为Lasso 和Ridge

  • L1正则化/Lasso

           L1正则化相比L2,会产生更稀疏的解,这个特性使得L1正则化称为一种很好的特征选择方法

from sklearn.linear_model import LinearRegression
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston

boston = load_boston()
scaler = StandardScaler()
X = scaler.fit_transform(boston["data"])
Y = boston["target"]
names = boston["feature_names"]


def pretty_print_linear(coefs, names = None, sort = False):
    if names == None:
        names = ["X%s" % x for x in range(len(coefs))]
    lst = zip(coefs, names)
    if sort:
        lst = sorted(lst,  key = lambda x:-np.abs(x[0]))
    return " + ".join("%s * %s" % (round(coef, 3), name)
                      for coef, name in lst)


lasso = Lasso(alpha=.3)
lasso.fit(X, Y)

print "Lasso model: ", pretty_print_linear(lasso.coef_, names, sort = True)


可以看到,很多特征的系数都是 0 ,如果继续增加alpha的值,得到的模型就会越来越稀疏

  • L2正则化
           L2正则化将稀疏向量的L2范数添加到损失函数中,由于L2惩罚项中系数是二次方的,这使得L2和L1有着很多差异,L2正则化会让系数的取值变的平均

随机森林

       随机森林具有准确率高、鲁棒性强、易于使用等优点,随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy

  • 平均不纯度减少

           决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二,利用不纯度可以确定节点(最优条件),对于分类问题通常采用基尼不纯度或者信息增益,对于回归问题,通常采用方差或最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度,对于一个决策森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征的选择的值 。

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np
#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rf = RandomForestRegressor()
rf.fit(X, Y)
print "Features sorted by their score:"
print sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names), 
             reverse=True)
  • 平均精确率的减少

           另一中常用的特征选择方法就是直接度量每个特征对模型精确度的影响,主要的思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响

参考:

https://blog.csdn.net/yywan1314520/article/details/51013289

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值