數據來源
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
先有收穫,再點在看!
公衆號後臺回覆關鍵詞 共享 可獲得項目數據集