抽象:特征工程
各种算法本身的精确度差异不大,分类器精确度更依赖训练数据的特征
一个好特征要很容易区分不同的事物
例子:给犬分类
要分类一种大型犬和小型犬(如灰猎犬和拉布拉多犬),特征可以选:
- 狗的身高
- 眼睛颜色
- 应选择哪个特征?
身高是比眼睛颜色更好的特征
假设眼睛颜色特征在1000只狗中,出现频率各占50%,那它跟区分狗种类就没有关系
生成身高特征数据:
import numpy as np
import matplotlib.pyplot as plt
# 每种狗一万只
gray = 10000
labs = 10000
# 生成身高数据,假设灰猎犬平均身高28英寸,拉布拉多24英寸
# 狗的身高,加上标准正态分布的一个变数,第二种狗比第一种一般低4英寸
# 身高是正态分布,每条狗数据加减4英寸左右
gray_height = 28 + 4 * np.random.randn(gray) # 灰猎犬平均身高28英寸
labs_height = 24 + 4 * np.random.randn(labs) # 拉布拉多犬平均身高24英寸
labs_height
plt.figure(figsize=(18, 10))
plt.hist(
gray_height,
color='gray',
alpha=0.3,
label='gray',
)
plt.hist(
labs_height,
color='g',
alpha=0.3,
label='labs'
)
plt.legend()
<matplotlib.legend.Legend at 0x8e9e390>
由直方图图可以判断不同身高的狗,是某个品种的概率,例如20英寸高的狗,比较可能是拉布拉多犬,35英寸高的可能是灰猎犬
身高25英寸的狗呢?无法判断
身高是个有用的特征但并不完美。所以机器学习需要多种特征,否则手动写个ifelse判断就行了,不需要训练分类器
- 特征工程是一门艺术而不是工程或科学,寻找特征时要假设如果不是分类器而是你,要完成任务:区分两个不同事物,需要什么特征,多少特征,怎样组合特征
- 去掉无用特征,例如分类概率50%的特征,混乱度大信息量低,不仅没有帮助还会破坏模型,因为加了他们就算出来正确结果也是碰巧,特别是数据量少的情况下
- 找相互独立的特征,去掉关联度高的特征,例如英寸身高和厘米身高,没有新的信息,分类器没有足够智能明白这是一个特征,会重复计算特征重要性
- 特征最好容易被理解,例如预测从两地之间收邮件的时间,两地距离是个好特征,而两地经纬度不是个好特征,因为时间和距离关系直观,而经纬度和时间不直观需要转换
做好特征工程,本质上靠的是对业务的熟悉程度