前言:在我的上一份文章中,介绍到了数据清洗的常用方法及其Python实现。这篇文章主要是在数据清洗后的特征工程的实现,特征工程包含三个方面,分别为特征提取、特征创造、特征选择。
特征提取 | 特征创造 | 特征选择 |
---|---|---|
从文字、图像、声音等其他非结构化数据中提取新信息作为特征。比如说,从地址中提取国家、省、市等信息。 | 将现有的特征进行组合,或者进行某种计算得到新的特征。例如我们的多元多次线性回归就可以借助已有的特征创造新的特征。 | 从所有的特征中,选择出有意义的,对模型有帮助的特征,避免特征量过多,训练时间长。 |
作为入门篇,我们主要的重点放在特征的选择上,其余两种会略有提及。
一:数据预处理
我们对数据的处理除了上一份文章提及到的消除缺失值、异常值、重复值的影响之外,还包括我们的数据预处理。这一部分都不改变数据原有的结构。
1.1 无量纲化
1.1.1 为什么要无量纲化
让我们思考这样一个问题,当我们使用梯度下降法进行近似求解的时候,如果各个特征量的量纲不统一会如何?可以参考下方的gif动图。实现代码如下:
import numpy as np
from ipywidgets import FloatSlider,VBox
from bqplot import pyplot as plt
# 创建数据集
X = np.random.rand(100, 1)
y = (4 + 3 * X) + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# 创建超参数
learning_rate = 0.001
n_interation = 1000
# 初始化θ
thetas = np.empty((n_interation,2))
theta = np.random.randn(2, 1)
# 判断是否收敛,一般不会设定阈值,而是直接采用设置相对大的迭代次数保证可以收敛
for iteration in range(n_interation):
# 求梯度
gradient = X_b.T.dot(X_b.dot(theta) - y)
# 应用梯度下降法调整θ值
theta = theta - learning_rate * gradient
thetas[iteration] = theta.reshape(1,2)
title_tmpl = 'θ的10的{}次方量级下的图形'
line_fig = plt.figure(title=title_tmpl.format(0))
line = plt.plot(np.array(range(n_interation)),thetas[0],'m',stroke_width=3)
line_2 = plt.plot(np.array(range(n_interation)),thetas[1],colors=['green'])
i_slider = FloatSlider(description='i',value=0,min=0,max=5,step=1)
def update_y(change):
new_i = i_slider.value
# 创建数据集
X = np.random.rand(100, 1)*(10**new_i)
y = (4 + 3 * X)/(10**new_i) + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X