从0到1走进 Kaggle
從0到1走進 Kaggle
深度學習?人工智能?神經網絡?機器學習 閱讀5112?作者:CSDN優秀博主 專欄作家 「不會停的蝸牛」
目錄:
- kaggle 是什么?
- 如何參賽?
- 解決問題一般步驟?
- 進一步:?
- 如何探索數據?
- 如何構造特征?
- 提交結果
kaggle 是什么?
Kaggle 是一個數據科學競賽的平臺,很多公司會發布一些接近真實業務的問題,吸引愛好數據科學的人來一起解決。?
https://www.kaggle.com/
點擊導航欄的 competitions 可以看到有很多比賽,其中正式比賽,一般會有獎金或者工作機會,除了正式比賽還有一些為初學者提供的 playground,在這里可以先了解這個比賽,練習能力,再去參加正式比賽。?
https://www.kaggle.com/competitions
如何參賽?
以 playground 中的這個 House Prices 預測為例,?
https://www.kaggle.com/c/house-prices-advanced-regression-techniques
-
Overview: 首先在 overview 中仔細閱讀問題的描述,這個比賽是讓我們預測房價,它會給我們 79 個影響房價的變量,我們可以通過應用 random forest,gradient boosting 等算法,來對房價進行預測。
-
Data:在這里給我們提供了 train 數據集,用來訓練模型;test 數據集,用來將訓練好的模型應用到這上面,進行預測,這個結果也是要提交到系統進行評價的;sample_submission 就是我們最后提交的 csv 文件中,里面的列的格式需要和這里一樣。
-
Kernels:可以看到一些參賽者分享的代碼。
-
Discussion:參賽者們可以在這里提問,分享經驗。
-
Leaderboard:就是參賽者的排行榜。
參加 kaggle 最簡單的流程就是:
- 第一步:在 Data 里面下載三個數據集,最基本的就是上面提到的三個文件,有些比賽會有附加的數據描述文件等。
- 第二步:自己在線下分析,建模,調參,把用 test 數據集預測好的結果,按照 sample_submission 的格式輸出到 csv 文件中。
- 第三步:點擊藍色按鈕 ’Submit Predictions’ ,把 csv 文件拖拽進去,然后系統就會加載并檢驗結果,稍等片刻后就會在 Leaderboard 上顯示當前結果所在的排名位置。
上傳過一次結果之后,就直接加入了這場比賽。正式比賽中每個團隊每天有 5 次的上傳機會,然后就要等 24 小時再次傳結果,playground 的是 9 次。
解決問題一般步驟?
應用算法解決 Kaggle 問題,一般會有以下幾個步驟:
當然上面是相對細的分步,如果簡化的話,是這么幾大步:
之前寫過一篇文章,《一個框架解決幾乎所有機器學習問題》?
http://blog.csdn.net/aliceyangxi1987/article/details/71079448?
里面的重點是介紹了常用算法模型一般需要調節什么參數,即第四步。
還有這篇,《通過一個kaggle實例學習解決機器學習問題》?
http://blog.csdn.net/aliceyangxi1987/article/details/71079473?
主要介紹了第三步建立模型的部分,包括 ensemble 的例子。
今天這篇文章算是一個補充,在觀察數據和特征構造上學習幾種常用的方式。
如何探索數據?
以 House prices 為例,探索數據常用方法有以下 6 步。?
https://www.kaggle.com/c/house-prices-advanced-regression-techniques
1. 首先,在 data_description.txt 這里有對 79 個變量含義非常詳細的描述
我們可以先通過閱讀變量含義,根據常識猜測一下,哪些變量會對預測結果有比較重要的影響。
例如:?
OverallQual: Overall material and finish quality 物料和質量應該是很重要的組成。?
GrLivArea: Above grade (ground) living area square feet 面積也是明顯的因素。?
YearBuilt: Original construction date 時間也有影響。
2. 接著,對要預測的目標數據 y 有一個宏觀的把握,這里是輸出 summary,也可以用 boxplot,histogram 等形式觀察
df_train['SalePrice'].describe()count 1460.000000 mean 180921.195890 std 79442.502883 min 34900.000000 25% 129975.000000 50% 163000.000000 75% 214000.000000 max 755000.000000 Name: SalePrice, dtype: float64count 就是有多少行觀察記錄,另外注意一下 min 并未有小于 0 的這樣的不合理的數值。
3. 通過 Correlation matrix 觀察哪些變量會和預測目標關系比較大,哪些變量之間會有較強的關聯
#correlation matrix corrmat = df_train.corr() f, ax = plt.subplots(figsize=(12, 9)) sns.heatmap(corrmat, vmax=.8, square=True);我們可以看上圖的最右邊一列(也可以是下面最后一行),顏色由深到淺查看,可以發現 OverallQual 和 GrLivArea 的確是對目標影響較大的因素,另外觀察中間區域的幾個深色塊,例如 ‘TotalBsmtSF’ 和 ‘1stFlrSF’ 二者關系較強,回看它們的定義,它們所包含的信息差不多所以才有顯示出強關聯:
TotalBsmtSF: Total square feet of basement area?
1stFlrSF: First Floor square feet
那這種時候,我們可以只取其中一個特征。
或者我們可以把與目標 ‘SalePrice’ 最緊密關聯的 10 個變量的關聯度打印出來:
#saleprice correlation matrix k = 10 #number of variables for heatmap cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index cm = np.corrcoef(df_train[cols].values.T) sns.set(font_scale=1.25) hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values) plt.show()通過這些數值,我們再一一觀察變量含義,判斷一下是否可以把其中某些變量刪除。
4. 接下來看 missing value
#missing data total = df_train.isnull().sum().sort_values(ascending=False) percent = (df_train.isnull().sum()/df_train.isnull().count()).sort_values(ascending=False) missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent']) missing_data.head(20)先把每個變量的 NaN 記錄個數求和算出來,再把所占的比例計算一下,對于占比例太大的變量,例如超過了 15%,就看看它的含義,如果不是很重要,這種數據是可以刪掉的,對于剩下的,再一個一個查看變量的含義,及比例,判斷是否可以刪掉,最后一個變量只有一條是 missing 的,那么就可以只刪掉這一個記錄。
此外,我們還可以通過補充 missing 的值,通過實際變量的含義進行補充,例如類別型變量,就可以補充成 No,數值型變量可以補充成 0,或者用平均值來填充。
#dealing with missing data df_train = df_train.drop((missing_data[missing_data['Total'] > 1]).index,1) df_train = df_train.drop(df_train.loc[df_train['Electrical'].isnull()].index)5. 下面是看 outliers?
我們可以先來看主要的幾個變量的 outliers
例如 ‘GrLivArea’ 這個變量,它的右下角這幾個點離主體就比較遠,可以猜測一下產生這樣數據的原因,但因為不能代表主體的,所以此時先刪掉:
#deleting points df_train.sort_values(by = 'GrLivArea', ascending = False)[:2] df_train = df_train.drop(df_train[df_train['Id'] == 1299].index) df_train = df_train.drop(df_train[df_train['Id'] == 524].index)6. 很重要的一步是把不符合正態分布的變量給轉化成正態分布的
因為一些統計檢驗方法需要數據滿足正態分布的條件。
#histogram and normal probability plot sns.distplot(df_train['SalePrice'], fit=norm); fig = plt.figure() res = stats.probplot(df_train['SalePrice'], plot=plt)這個圖里可以看到 ‘SalePrice’ 的分布是正偏度,在正偏度的情況下,用 log 取對數后可以做到轉換:
#applying log transformation df_train['SalePrice'] = np.log(df_train['SalePrice'])同樣,我們可以把其他不符合正態分布的變量進行轉化,例如 GrLivArea 和 目標值 SalePrice 在轉化之前的關系圖是類似錐形的:
#scatter plot plt.scatter(df_train['GrLivArea'], df_train['SalePrice']);在對 GrLivArea 轉換后,
#data transformation df_train['GrLivArea'] = np.log(df_train['GrLivArea'])如何構造特征?
通過上面的步驟,我們大概可以篩選出一些重要的特征,除了數據集給定的變量之外,我們也可以自己建立一些新的特征。
1. 數值變類別型?
例如,MoSold: Month Sold 這個變量看起來是數值型的,但其實更符合類別型的,所以要做一下轉換:
2. 類別型加順序?
例如,Functional: Home functionality rating 這個變量,它是個 rating,那么這種數值應該是有序的,并且這種順序是帶有信息的,那我們就給轉化成數字:
3. 簡化類別?
當然類別太多了的不好,可以進一步簡化成兩三個等級:
4. 構造多項式?
另外一種常用的方式是構造多項式,一般是 2次項,3次項,開平方:
5. 加減乘除?
還有通過加減乘除的數學關系構造:
OverallQual: Overall material and finish quality?
OverallCond: Overall condition rating
6. 變為 one-hot?
然后我們來把 categorical 的變量給變成 one-hot 的形式:
提交結果
接下來用一個最簡單的線性規劃,來展示一下運行步驟,
1. 引入常用包
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline2. 導入數據
train = pd.read_csv("train.csv") test = pd.read_csv("test.csv")print ("Train data shape:", train.shape) print ("Test data shape:", test.shape) #('Train data shape:', (1460, 81)) #('Test data shape:', (1459, 80))3. 取 log 轉化為正態,看 correlation,處理 outliers,missing value
此處可以對 train 數據集應用數據探索的幾種方法。
#取 log 轉化為正態 target = np.log(train.SalePrice)#看 correlation numeric_features = train.select_dtypes(include=[np.number]) numeric_features.dtypes corr = numeric_features.corr() print (corr['SalePrice'].sort_values(ascending=False)[:5], '\n') print (corr['SalePrice'].sort_values(ascending=False)[-5:])#處理 outliers train = train[train['GarageArea'] < 1200]#處理 missing value data = train.select_dtypes(include=[np.number]).interpolate().dropna()4. 轉化為 one-hot 向量
這里可以用構造特征的幾種方法。
train['enc_street'] = pd.get_dummies(train.Street, drop_first=True) test['enc_street'] = pd.get_dummies(train.Street, drop_first=True)5. 模型訓練,預測
用?train_test_split?將 train 數據集分為 train 和 valid 數據,?
只用一個簡單的?linear_model?來擬合,用?mean_squared_error?得到誤差值。
對 test.csv 應用剛才的模型進行預測,因為前面對 test 數據取了 log,這里要用 exp 變為原來的范圍。
feats = test.select_dtypes(include=[np.number]).drop(['Id'], axis=1).interpolate() predictions = model.predict(feats) final_predictions = np.exp(predictions)6. 提交結果
構造一個 submission 格式的 csv,將?final_predictions?作為預測值列輸入進去,?
輸出這個 csv 后,就可以在比賽主頁上的 submit 藍色按鈕上點擊提交。
初級的結果出來了,大概在50%的排位,之后可以嘗試其他算法:
例如 Random Forest Regressors , Gradient Boosting,ensembling models 等,以及過擬合的分析,配合特征工程等。
這篇文章里面的代碼例子,并不會帶你進入前幾位,只是介紹一個完整的過程,常用的方法和代碼實現,至于如何讓算法發揮高效作用,就看玩家怎么挖掘特征,怎么組合算法和特征,怎么調參了,因為這也是最有趣的環節,以一個輕松的方式入門,再以一個提升的心態不斷進步。
參考:?
https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python?
https://www.kaggle.com/juliencs/a-study-on-regression-applied-to-the-ames-dataset
總結
以上是生活随笔為你收集整理的从0到1走进 Kaggle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里研究院潘永花:大数据将成为新的煤和石
- 下一篇: 大数据征信应用与启示 ——以美国互联网金