手把手|共享單車數據特徵工程

數據來源

Kaggle上有這樣一個比賽:城市自行車共享系統使用狀況。

提供的數據爲2年內按小時做的自行車租賃數據,其中訓練集由每個月的前19天組成,測試集由20號之後的時間組成。

本項目一此數據爲例,進行簡單的特徵工程

數據清洗

讀取數據

#先把數據讀進來
import pandas as pd
data = pd.read_csv('kaggle_bike_competition_train.csv', header = 0, error_bad_lines=False)
#看一眼數據長什麼樣
data.head()

把datetime域切成日期和時間兩部分

# 處理時間字段
temp = pd.DatetimeIndex(data['datetime'])
data['date'] = temp.date
data['time'] = temp.time
data.head()

時間那部分,好像最細的粒度是小時,所以我們乾脆把小時字段拿出來作爲更簡潔的特徵。

# 設定hour這個小時字段
data['hour'] = pd.to_datetime(data.time, format="%H:%M:%S")
data['hour'] = pd.Index(data['hour']).hour
data

仔細想想,數據只告訴我們是哪天了,按照一般邏輯,應該週末和工作日出去的人數量不同吧。我們設定一個新的字段dayofweek表示是一週中的第幾天。再設定一個字段dateDays表示離第一天開始租車多久了(猜測在歐美國家,這種綠色環保的出行方式,會迅速蔓延吧)

# 我們對時間類的特徵做處理,產出一個星期幾的類別型變量
data['dayofweek'] = pd.DatetimeIndex(data.date).dayofweek

# 對時間類特徵處理,產出一個時間長度變量
data['dateDays'] = (data.date - data.date[0]).astype('timedelta64[D]')

其實我們剛纔一直都在猜測,並不知道真實的日期相關的數據分佈對吧,所以我們要做一個小小的統計來看看真實的數據分佈,我們統計一下一週各天的自行車租賃情況(分註冊的人和沒註冊的人)

byday = data.groupby('dayofweek')
# 統計下沒註冊的用戶租賃情況
byday['casual'].sum().reset_index()
# 統計下注冊的用戶的租賃情況
byday['registered'].sum().reset_index()

週末既然有不同,就單獨拿一列出來給星期六,再單獨拿一列出來給星期日

data['Saturday']=0
data.Saturday[data.dayofweek==5]=1

data['Sunday']=0
data.Sunday[data.dayofweek==6]=1

從數據中,把原始的時間字段等踢掉

dataRel = data.drop(['datetime', 'count','date','time','dayofweek'], axis=1)

特徵向量化

我們這裏打算用scikit-learn來建模。對於pandas的dataframe我們有方法/函數可以直接轉成python中的dict。另外,在這裏我們要對離散值和連續值特徵區分一下了,以便之後分開做不同的特徵處理。

from sklearn.feature_extraction import DictVectorizer
# 我們把連續值的屬性放入一個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)

標準化連續值特徵

我們要對連續值屬性做一些處理,最基本的當然是標準化,讓連續值屬性處理過後均值爲0,方差爲1。這樣的數據放到模型裏,對模型訓練的收斂和模型的準確性都有好處

from sklearn import preprocessing
# 標準化連續值數據
scaler = preprocessing.StandardScaler().fit(X_vec_con)
X_vec_con = scaler.transform(X_vec_con)

類別特徵編碼

最常用的當然是one-hot編碼咯,比如顏色 紅、藍、黃 會被編碼爲[1, 0, 0],[0, 1, 0],[0, 0, 1]

from sklearn import preprocessing
# one-hot編碼
enc = preprocessing.OneHotEncoder()
enc.fit(X_vec_cat)
X_vec_cat = enc.transform(X_vec_cat).toarray()

特徵拼接

把離散和連續的特徵都組合在一起

import numpy as np
X_vec = np.concatenate((X_vec_con,X_vec_cat), axis=1)

最後的特徵,前6列是標準化過後的連續值特徵,後面是編碼後的離散值特徵

處理y值

# 對Y向量化
Y_vec_reg = dataRel['registered'].values.astype(float)
Y_vec_cas = dataRel['casual'].values.astype(float)

喜歡本文的讀者歡迎在看轉發,這是對我最大的支持!感謝~

往期文章Pandas時間序列數據操作
readability: 英文文本數據可讀性庫

Matplotlib中的plt和ax都是啥?

70G上市公司定期報告數據集
5個小問題帶你理解列表推導式
文本數據清洗之正則表達式
Python網絡爬蟲與文本數據分析
綜述:文本分析在市場營銷研究中的應用
如何批量下載上海證券交易所上市公司年報
Numpy和Pandas性能改善的方法和技巧
漂亮~pandas可以無縫銜接Bokeh
YelpDaset: 酒店管理類數據集10+G

先有收穫,再點在看!

公衆號後臺回覆關鍵詞 共享 可獲得項目數據集

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章