第6讲:特征工程

coding: utf-8

import pandas as pd
import numpy as np
from sklearn.feature_extraction import DictVectorizer
from sklearn import preprocessing

# 特征工程小案例

Kaggle上有这样一个比赛:城市自行车共享系统使用状况

提供的数据为2年内按小时做的自行车租赁数据,其中训练集由每个月的前19天组成,

测试集由20号之后的时间组成。

1、先把数据读进来

data = pd.read_csv(‘kaggle_bike_competition_train.csv’, header = 0, error_bad_lines=False)

2、看一眼数据长什么样

print(“data.head()1:”)
print(data.head())

3、把datetime域切成 日期 和 时间 两部分。

处理时间字段

temp = pd.DatetimeIndex(data[‘datetime’])
data[‘date’] = temp.date
data[‘time’] = temp.time
print(“data.head()2:”)
print(data.head())

### 时间那部分,好像最细的粒度也只到小时,所以我们干脆把小时字段拿出来作为更简洁的特征。

4、设定hour这个小时字段

data[‘hour’] = pd.to_datetime(data.time, format=”%H:%M:%S”)
data[‘hour’] = pd.Index(data[‘hour’]).hour
print(“data1:”)
print(data)

### 仔细想想,数据只告诉我们是哪天了,按照一般逻辑,应该周末和工作日出去的人数量不同吧。我们设定一个新的字段dayofweek表示是一周中的第几天。再设定一个字段dateDays表示离第一天开始租车多久了(猜测在欧美国家,这种绿色环保的出行方式,会迅速蔓延吧)

5、我们对时间类的特征做处理,产出一个星期几的类别型变量

data[‘dayofweek’] = pd.DatetimeIndex(data.date).dayofweek

对时间类特征处理,产出一个时间长度变量

data[‘dateDays’] = (data.date - data.date[0]).astype(‘timedelta64[D]’)

print(“data2:”)
print(data)

### 其实我们刚才一直都在猜测,并不知道真实的日期相关的数据分布对吧,所以我们要做一个小小的统计来看看真实的数据分布,我们统计一下一周各天的自行车租赁情况(分注册的人和没注册的人)

6、按照dayofweek统计用户使用情况

byday = data.groupby(‘dayofweek’)

统计下没注册的用户租赁情况

print(“byday[‘casual’].sum().reset_index():”)
print(byday[‘casual’].sum().reset_index())

7、统计下注册的用户的租赁情况

print(“byday[‘registered’].sum().reset_index():”)
print(byday[‘registered’].sum().reset_index())

### 周末既然有不同,就单独拿一列出来给星期六,再单独拿一列出来给星期日

8、把周六和周日专门拿出来

data[‘Saturday’]=0
data.Saturday[data.dayofweek==5]=1

data[‘Sunday’]=0
data.Sunday[data.dayofweek==6]=1

print(“data3:”)
print(data)

9、从数据中,把原始的时间字段等踢掉

remove old data features

dataRel = data.drop([‘datetime’, ‘count’,’date’,’time’,’dayofweek’], axis=1)
print(“dataRel.head():”)
print(dataRel.head())

10、特征向量化

我们这里打算用scikit-learn来建模。对于pandas的dataframe我们有方法/函数可以直接转成python中的dict。

另外,在这里我们要对离散值和连续值特征区分一下了,以便之后分开做不同的特征处理。

我们把连续值的属性放入一个dict中

featureConCols = [‘temp’,’atemp’,’humidity’,’windspeed’,’dateDays’,’hour’]
dataFeatureCon = dataRel[featureConCols]
dataFeatureCon = dataFeatureCon.fillna( ‘NA’ ) #in case I missed any
X_dictCon = dataFeatureCon.T.to_dict().values()

把离散值的属性放到另外一个dict中

featureCatCols = [‘season’,’holiday’,’workingday’,’weather’,’Saturday’, ‘Sunday’]
dataFeatureCat = dataRel[featureCatCols]
dataFeatureCat = dataFeatureCat.fillna( ‘NA’ ) #in case I missed any
X_dictCat = dataFeatureCat.T.to_dict().values()

向量化特征

vec = DictVectorizer(sparse = False)
X_vec_cat = vec.fit_transform(X_dictCat)
X_vec_con = vec.fit_transform(X_dictCon)

11、输出连续值的头

print(“dataFeatureCon.head():”)
print(dataFeatureCon.head())

12、输出连续的值

print(“X_vec_con:”)
print(X_vec_con)

13、输出离散值的头

print(“dataFeatureCat.head():”)
print(dataFeatureCat.head())

14、输出离散值的值

print(“X_vec_cat:”)
print(X_vec_cat)

15、标准化连续值特征

我们要对连续值属性做一些处理,最基本的当然是标准化,让连续值属性处理过后均值为0,方差为1。

这样的数据放到模型里,对模型训练的收敛和模型的准确性都有好处

标准化连续值数据

scaler = preprocessing.StandardScaler().fit(X_vec_con)
X_vec_con = scaler.transform(X_vec_con)
print(“X_vec_con:”)
print(X_vec_con)

16、类别特征编码

最常用的当然是one-hot编码咯,比如颜色 红、蓝、黄 会被编码为[1, 0, 0],[0, 1, 0],[0, 0, 1]

one-hot编码

enc = preprocessing.OneHotEncoder()
enc.fit(X_vec_cat)
X_vec_cat = enc.transform(X_vec_cat).toarray()
print(“X_vec_cat:”)
print(X_vec_cat)

17、把特征拼一起

把离散和连续的特征都组合在一起

combine cat & con features

X_vec = np.concatenate((X_vec_con,X_vec_cat), axis=1)
print(“X_vec:”)
print(X_vec)

最后的特征,前6列是标准化过后的连续值特征,后面是编码后的离散值特征

18、把结果也处理一下,拿到结果的浮点数据,对Y向量化

Y_vec_reg = dataRel[‘registered’].values.astype(float)
Y_vec_cas = dataRel[‘casual’].values.astype(float)

print(“Y_vec_reg:”)
print(Y_vec_reg)
print(“Y_vec_cas:”)
print(Y_vec_reg)

文章出自声明:原文来自寒小阳老师的深度学习视频第6讲内容改变

猜你喜欢

转载自blog.csdn.net/junchengberry/article/details/80180406
今日推荐