<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發者 正文
      發私信給AI研習社
      發送

      0

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      本文作者: AI研習社 2017-05-24 11:46
      導語:深入淺出 Kaggle 入門

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      雷鋒網按:本文作者楊熹,此前剛剛參加了一次 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 

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      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 次。

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

        解決問題一般步驟?

      應用算法解決 Kaggle 問題,一般會有以下幾個步驟:

      ● 識別問題

      ● 探索數據

      ● 數據預處理

      ● 將 train.csv 分成 train 和 valid 數據

      ● 構造新的重要特征數據

      ● 應用算法模型

      ● 優化模型

      ● 選擇提取重要特征

      ● 再次選擇模型,進行訓練

      ● 調參

      ● 重復上述過程,進一步調優

      ● 預測

      當然上面是相對細的分步,如果簡化的話,是這么幾大步:

      ● 探索數據

      ● 特征工程

      ● 建立模型

      ● 調參

      ● 預測提交

      之前寫過一篇文章,一個框架解決幾乎所有機器學習問題》 

      里面的重點是介紹了常用算法模型一般需要調節什么參數,即第四步。

      還有這篇,通過一個kaggle實例學習解決機器學習問題》 

      主要介紹了第三步建立模型的部分,包括 ensemble 的例子。

      今天這篇文章算是一個補充,在觀察數據和特征構造上學習幾種常用的方式。

        如何探索數據?

      以 House prices 為例,探索數據常用方法有以下 6 步。 

      https://www.kaggle.com/c/house-prices-advanced-regression-techniques 

      1. 首先,在 data_description.txt 這里有對 79 個變量含義非常詳細的描述

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      我們可以先通過閱讀變量含義,根據常識猜測一下,哪些變量會對預測結果有比較重要的影響。

      例如: 

      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: float64

      count 就是有多少行觀察記錄,另外注意一下 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);

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      我們可以看上圖的最右邊一列(也可以是下面最后一行),顏色由深到淺查看, 

      可以發現 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()

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      通過這些數值,我們再一一觀察變量含義,判斷一下是否可以把其中某些變量刪除。

      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)

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      先把每個變量的 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

      #bivariate analysis saleprice/grlivarea

      var = 'GrLivArea'

      data = pd.concat([df_train['SalePrice'], df_train[var]], axis=1)

      data.plot.scatter(x=var, y='SalePrice', ylim=(0,800000));

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      例如 ‘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)

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      6. 很重要的一步是把不符合正態分布的變量給轉化成正態分布的 

      因為一些統計檢驗方法需要數據滿足正態分布的條件。

      #histogram and normal probability plot

      sns.distplot(df_train['SalePrice'], fit=norm);

      fig = plt.figure()

      res = stats.probplot(df_train['SalePrice'], plot=plt)

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      這個圖里可以看到 ‘SalePrice’ 的分布是正偏度,在正偏度的情況下,用 log 取對數后可以做到轉換:

      #applying log transformation

      df_train['SalePrice'] = np.log(df_train['SalePrice'])

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      同樣,我們可以把其他不符合正態分布的變量進行轉化, 

      例如 GrLivArea 和 目標值 SalePrice 在轉化之前的關系圖是類似錐形的:

      #scatter plot

      plt.scatter(df_train['GrLivArea'], df_train['SalePrice']);

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      在對 GrLivArea 轉換后,

      #data transformation

      df_train['GrLivArea'] = np.log(df_train['GrLivArea'])

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

        如何構造特征?

      通過上面的步驟,我們大概可以篩選出一些重要的特征,除了數據集給定的變量之外,我們也可以自己建立一些新的特征。

      1. 數值變類別型 

      例如,MoSold: Month Sold 這個變量看起來是數值型的,但其實更符合類別型的,所以要做一下轉換:

      "MoSold" : {1 : "Jan", 2 : "Feb", 3 : "Mar", 4 : "Apr", 5 : "May", 6 : "Jun", 7 : "Jul", 8 : "Aug", 9 : "Sep", 10 : "Oct", 11 : "Nov", 12 : "Dec"}

      2. 類別型加順序 

      例如,Functional: Home functionality rating 這個變量,它是個 rating,那么這種數值應該是有序的,并且這種順序是帶有信息的,那我們就給轉化成數字:

      "Functional" : {"Sal" : 1, "Sev" : 2, "Maj2" : 3, "Maj1" : 4, "Mod": 5, "Min2" : 6, "Min1" : 7, "Typ" : 8}

      3. 簡化類別 

      當然類別太多了的不好,可以進一步簡化成兩三個等級:

      train["SimplFunctional"] = train.Functional.replace(

      {1 : 1, 2 : 1, # bad

      3 : 2, 4 : 2, # major

      5 : 3, 6 : 3, 7 : 3, # minor

      8 : 4 # typical})

      4. 構造多項式 

      另外一種常用的方式是構造多項式,一般是 2次項,3次項,開平方:

      train["OverallQual-s2"] = train["OverallQual"] ** 2

      train["OverallQual-s3"] = train["OverallQual"] ** 3

      train["OverallQual-Sq"] = np.sqrt(train["OverallQual"])

      5. 加減乘除 

      還有通過加減乘除的數學關系構造:

      OverallQual: Overall material and finish quality 

      OverallCond: Overall condition rating

      train["OverallGrade"] = train["OverallQual"] * train["OverallCond"]

      6. 變為 one-hot 

      然后我們來把 categorical 的變量給變成 one-hot 的形式:

      #convert categorical variable into dummy

      df_train = pd.get_dummies(df_train)

        提交結果

      接下來用一個最簡單的線性規劃,來展示一下運行步驟,

      1. 引入常用包

      import pandas as pd

      import numpy as np

      import matplotlib.pyplot as plt

      %matplotlib inline

      2. 導入數據

      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 得到誤差值。

      y = np.log(train.SalePrice)

      X = data.drop(['SalePrice', 'Id'], axis=1)


      from sklearn.model_selection import train_test_split

      X_train, X_test, y_train, y_test = train_test_split(

                                          X, y, random_state=42, test_size=.33)


      from sklearn import linear_model

      lr = linear_model.LinearRegression()


      model = lr.fit(X_train, y_train)


      predictions = model.predict(X_test)


      from sklearn.metrics import mean_squared_error

      print ('RMSE is: \n', mean_squared_error(y_test, predictions))

      對 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 藍色按鈕上點擊提交。

      submission = pd.DataFrame()

      submission['Id'] = test.Id

      submission['SalePrice'] = final_predictions

      submission.to_csv('output.csv', index=False)


      #Your submission scored 0.13878

      初級的結果出來了,大概在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

      雷鋒網相關閱讀:

      一個實例告訴你:Kaggle 數據競賽都有哪些套路

      加入 Kaggle 大數據競賽,總共分幾步?

      雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

      開發者自述:我是如何從 0 到 1 走進 Kaggle 的

      分享:
      相關文章

      編輯

      聚焦數據科學,連接 AI 開發者。更多精彩內容,請訪問:yanxishe.com
      當月熱門文章
      最新文章
      請填寫申請人資料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 在线看av一区二区三区| 久久久亚洲精品午夜福利| 激情综合网激情激情五月天| 无码福利一区二区三区| 久久99国产乱子伦精品免费| 国产乱视频在线观看| 伊人久久大香线蕉av一区| 色一情一乱一伦一区二区三区| 亚洲国产成人久久77| 久久精品国产曰本波多野结衣| 射死你天天日| 熟妇导航| 中文字幕国产日韩精品| 性男女做视频观看网站| 亚洲AV专区无码观看精品天堂| 国产午夜人做人免费视频中文| 亚洲男女羞羞无遮挡久久丫| 欧美日韩精品综合在线一区| 野外少妇愉情中文字幕| 国产精品va在线观看无码不卡| 国产精品美女黑丝流水| 日本一区免费视频| 午夜精品久久久久成人| 日日插中文字幕| 人妻少妇久久中文字幕| 美女张开腿黄网站免费下载| 曰批永久免费40分钟免费观看软件| 亚洲 欧美 影音先锋| 无码人妻丰满熟妇a片护士| 亚洲精品无码专区在线| 日韩无码2020| 日韩在线一区二区三区免费视频| AV中文天堂| 自拍亚洲一区欧美另类| 99热久久这里只有精品| 在线看免费无码的av天堂| 狠狠色AV一区二区| 亚洲成av人片色午夜乱码| 日产精品一区二区| 熟女爱V| 国产亚洲成人网站|