——Andrew Ng

## 0x01 笛卡尔乘积特征构造

### 2.类别特征进行笛卡尔乘积特征组合

red, green, blue

on, off

X on off

1 1 0 0 0 0 0
2 0 1 0 0 0 0
3

#### 4）实现代码

```color = ['on', 'on', 'off', 'off', 'off', ]
light = ['red', 'green', 'blue', 'red', 'green', ]
df = pd.DataFrame({'color': color, 'light': light})

color light
0 on red
1 on green
2 off blue
3 off red
4 off green

```def cartesian_product_feature_crosses(df, feature1_name, feature2_name):
feature1_df = pd.get_dummies(df[feature1_name], prefix=feature1_name)
feature1_columns = feature1_df.columns
feature2_df = pd.get_dummies(df[feature2_name], prefix=feature2_name)
feature2_columns = feature2_df.columns
combine_df = pd.concat([feature1_df, feature2_df], axis=1)
crosses_feature_columns = []
for feature1 in feature1_columns:
for feature2 in feature2_columns:
crosses_feature = '{}&{}'.format(feature1, feature2)
crosses_feature_columns.append(crosses_feature)
combine_df[crosses_feature] = combine_df[feature1] * combine_df[feature2]
combine_df = combine_df.loc[:, crosses_feature_columns]
return combine_df
combine_df = cartesian_product_feature_crosses(df, 'color', 'light')

color_off & light_blue color_off & light_green color_off & light_red color_on & light_blue color_on & light_green color_on & light_red
0 0 0 0 0 0 1
1 0 0 0 0 1 0
2 1 0 0 0 0 0
3 0 0 1 0 0 0
4 0 1 0 0 0 0

### 3.连续值特征进行笛卡尔乘积特征组合

#### 1）特征说明

binned_latitude：

binned_longitude：

#### 2）特征分箱结果

```binned_latitude(lat) = [
0  < lat <= 10
10 < lat <= 20
20 < lat <= 30
]
binned_longitude(lon) = [
0  < lon <= 15
15 < lon <= 30
]```

1 1 0 0 0 0 0
2

## 0x02 遗传编程特征构造

### 2.gplearn

gplearn 这个库提供了解决的思路：

### 3.遗传编程的用法

gplearn 的主要组成部分有两个：SymbolicRegressor 和 SymbolicTransformer 。两者的适应度有所不同。

Symbolic Regressor（回归器）

Symbolic Transformer（转换器）

#### 符号转换器（Symbolic Transformer）

```# 数据集：波士顿数据集
# 训练Ridge模型
est = Ridge()
est.fit(boston.data[:300, :], boston.target[:300])
print(est.score(boston.data[300:, :], boston.target[300:]))
# 输出：0.759145222183
# 使用超过20代的2000人。选择最好的100个hall_of_fame，然后使用最不相关的10作为我们的新功能。因为我们使用线性模型作为估算器，所以这里使用默认值metric='pearson'。
function_set = ['add', 'sub', 'mul', 'div',
'sqrt', 'log', 'abs', 'neg', 'inv',
'max', 'min']
gp = SymbolicTransformer(generations=20, population_size=2000,
hall_of_fame=100, n_components=10,
function_set=function_set,
parsimony_coefficient=0.0005,
max_samples=0.9, verbose=1,
random_state=0, n_jobs=3)
gp.fit(boston.data[:300, :], boston.target[:300])
# 将新构造的特征拼接到原始数据上
gp_features = gp.transform(boston.data)
new_boston = np.hstack((boston.data, gp_features))
# 使用新的特征重新训练Ridge模型
est = Ridge()
est.fit(new_boston[:300, :], boston.target[:300])
print(est.score(new_boston[300:, :], boston.target[300:]))
# 输出：0.841750404385```

## 0x0FF 总结

### 参考文献

[2] https://www.cnblogs.com/nxf-rabbit75/p/11141944.html#_nav_12

[4] 利用 gplearn 进行特征工程. https://bigquant.com/community/t/topic/120709