用python参加Kaggle的些许经验总结

最近挤出时间,用python在kaggle上试了几个project,有点体会,记录下。

Step1: Exploratory Data Analysis

EDA,也就是对数据进行探索性的分析,一般就用到pandas和matplotlib就够了。EDA一般包括:

  1. 每个feature的意义,feature的类型,比较有用的代码如下
    df.describe()
    df['Category'].unique()
  2. 看是否存在missing value
    df.loc[df.Dates.isnull(),'Dates']
  3. 每个特征下的数据分布,可以用boxplot或者hist来看
    %matplotlib inline
    import matplotlib.pyplot as plt
    df.boxplot(column='Fare', by = 'Pclass')
    plt.hist(df['Fare'], bins = 10, range =(df['Fare'].min(),df['Fare'].max()))
    plt.title('Fare >distribution')
    plt.xlabel('Fare')
    plt.ylabel('Count of Passengers')
    #如果变量是categorical的,想看distribution,则可以:
    df.PdDistrict.value_counts().plot(kind='bar', figsize=(8,10))
  4. 如果想看几个feature之间的联立情况,则可以用pandas的groupby,
    temp = pd.crosstab([df.Pclass, df.Sex], df.Survived.astype(bool))
    temp.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)

在这步完成之后,要对以下几点有大致了解

  • 理解每个特征的意义
  • 要知道哪些特征是有用的,这些特征哪些是直接可以用的,哪些需要经过变换才能用,为之后的特征工程做准备

Step2: Data Preprocessing

数据预处理,就是将数据处理下,为模型输入做准备,其中包括:

  • 处理missing value:这里学问有点深,如果各位有好的经验可以跟我交流下。以我浅薄的经验来说我一般会分情况处理
    1. 如果missing value占总体的比例非常小,那么直接填入平均值或者众数
    2. 如果missing value所占比例不算小也不算大,那么可以考虑它跟其他特征的关系,如果关系明显,那么直接根据其他特征填入;也可以建立简单的模型,比如线性回归,随机森林等。
    3. 如果missing value所占比例大,那么直接将miss value当做一种特殊的情况,另取一个值填入
  • 处理Outlier:这个就是之前EDA的作用了,通过画图,找出异常值
  • 处理categorical feature:一般就是通过dummy variable的方式解决,也叫one hot encode,可以通过pandas.get_dummies()或者 sklearn中preprocessing.OneHotEncoder(), 我个人倾向于用pandas的get_dummies()
    看个例子吧,

    dummy variable

    将一列的month数据展开为了12列,用0、1代表类别。
    另外在处理categorical feature有两点值得注意:
    1. 如果特征中包含大量需要做dummy variable处理的,那么很可能导致得到一个稀疏的dataframe,这时候最好用下PCA做降维处理。
    2. 如果某个特征有好几万个取值,那么用dummy variable就并不现实了,这时候可以用Count-Based Learning.
    3. (更新)近期在kaggle成功的案例中发现,对于类别特征,在模型中加入tf-idf总是有效果的。
    4. 还有个方法叫“Leave-one-out” encoding,也可以处理类别特征种类过多的问题,实测效果不错。

Step 3: Feature Engineering

理论上来说,特征工程应该也归属于上一步,但是它太重要了,所以将它单独拿出来。kaggle社区对特征工程的重要性已经达成了共识,可以说最后结果的好坏,大部分就是由特征工程决定的,剩下部分应该是调参Ensemble决定。特征工程的好坏主要是由domain knowledge决定的,但是大部分人可能并不具备这种知识,那么只能尽可能多的根据原来feature生成新的feature,然后让模型选择其中重要的feature。这里就又涉及到feature selection,
有很多方法,比如backward,forward selection等等。我个人倾向于用random forest的feature importance这里有论文介绍了这种方法。

Step 4: Model Selection and Training

  • 最常用的模型是Ensemble Model,比如 Random Forest,Gradient Boosting。当然在开始的时候,可以用点简单的模型,一方面是可以作为底线threshold,另一方面也可以在最后作为Ensemble Model。
    当然还有大名鼎鼎的xgboost,这个我也没有深入的研究,只是简单的用python调用了下,接下来如果有时间,要好好深入研究下。
  • 选择完模型之后,就是要训练模型,主要就是调参,每种模型都有自己最关键的几个参数,sklearn中GridSearchCV可以设置需要比较的几种参数组合,然后用cross validation来选出最优秀的参数组合。大概用法为:
    from sklearn.grid_search import GridSearchCV
    from pprint import pprint
    clf=RandomForestClassifier(random_state=seed)
    parameters = {'n_estimators': [300, 500], 'max_features':[4,5,'auto']}
    grid_search = GridSearchCV(estimator=clf,param_grid=parameters, cv=10, scoring='accuracy')
    print("parameters:")
    pprint(parameters)
    grid_search.fit(train_x,train_y)
    print("Best score: %0.3f" % grid_search.best_score_)
    print("Best parameters set:")
    best_parameters=grid_search.best_estimator_.get_params()
    for param_name in sorted(parameters.keys()):
        print("\t%s: %r" % (param_name, best_parameters[param_name]))

Step 5: Model Ensemble

Model Ensemble有Bagging,Boosting,Stacking,其中Bagging和Boosting都算是Bootstraping的应用。Bootstraping的概念是对样本每次有放回的抽样,抽样K个,一共抽N次。

  • Bagging:每次从总体样本中随机抽取K个样本来训练模型,重复N次,得到N个模型,然后将各个模型结果合并,分类问题投票方式结合,回归则是取平均值,e.g.Random Forest。
  • Boosting:一开始给每个样本取同样的权重,然后迭代训练,每次对训练失败的样本调高其权重。最后对多个模型用加权平均来结合,e.g. GBDT。
  • Bagging与Boosting的比较:在深入理解Bagging和Boosting后发现,bagging其实是用相同的模型来训练随机抽样的数据,这样的结果是各个模型之间的bias差不多,variance也差不多,通过平均,使得variance降低(由算平均方差的公式可知),从而提高ensemble model的表现。而Boosting其实是一种贪心算法,不断降低bias。
  • Stacking: 训练一个模型来组合其他各个模型。首先先训练多个不同的模型,然后再以之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。使用过stacking之后,发现其实stacking很像神经网络,通过很多模型的输出,构建中间层,最后用逻辑回归讲中间层训练得到最后的结果。这里贴一个例子供参考。
    def single_model_stacking(clf):
      skf = list(StratifiedKFold(y, 10))
      dataset_blend_train = np.zeros((Xtrain.shape[0],len(set(y.tolist()))))
      # dataset_blend_test = np.zeros((Xtest.shape[0],len(set(y.tolist()))))
      dataset_blend_test_list=[]
      loglossList=[]
      for i, (train, test) in enumerate(skf):
      #     dataset_blend_test_j = []
          X_train = Xtrain[train]
          y_train =dummy_y[train]
          X_val = Xtrain[test]
          y_val = dummy_y[test]
          if clf=='NN_fit':            
              fold_pred,pred=NN_fit(X_train, y_train,X_val,y_val)
          if clf=='xgb_fit':
              fold_pred,pred=xgb_fit(X_train, y_train,X_val,y_val)
          if clf=='lr_fit':
              fold_pred,pred=lr_fit(X_train, y_train,X_val,y_val)
          print('Fold %d, logloss:%f '%(i,log_loss(y_val,fold_pred)))
          dataset_blend_train[test, :] = fold_pred
          dataset_blend_test_list.append( pred )
          loglossList.append(log_loss(y_val,fold_pred))
      dataset_blend_test = np.mean(dataset_blend_test_list,axis=0)
      print('average log loss is :',np.mean(log_loss(y_val,fold_pred)))
      print ("Blending.")
      clf = LogisticRegression(multi_class='multinomial',solver='lbfgs')
      clf.fit(dataset_blend_train, np.argmax(dummy_y,axis=1))
      pred = clf.predict_proba(dataset_blend_test)
      return pred

    Step 6: Two Little Tips

    最后是我的两点心得吧
  • 设置random seed,使得你的模型reproduce,以Random Foreset举例:
    seed=0
    clf=RandomForestClassifier(random_state=seed)
  • 每个project组织好文件层次和布局,既方便与其他人交流,也方便自己。比如在一个project下,分设3个文件夹,一个是input,放训练数据、测试数据,一个model,放模型文件,最后一个submission文件,放你生成要提交的结果文件。
    具体的可以参考这里

最后的回顾和展望

这篇文章是参加kaggle之后的第一次总结,描述了下kaggle的步骤,通用的知识点和技巧。希望在未来一个月中,能把xgboost和stacking研究应用下,然后再来update。希望大家有什么想法都能跟我交流下~~

update: 更新了关于类别特征的处理方式以及Boosting和Bagging的看法,还有stacking的内容。



文/JxKing(简书作者)
原文链接:http://www.jianshu.com/p/32def2294ae6
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,你需要安装kaggle的API,运行以下命令来安装: ``` pip install kaggle ``` 然后,你需要在Kaggle上创建一个帐户并获取API凭证。这些凭证应该被保存在~/.kaggle/kaggle.json文件中。 现在,你可以使用以下代码来下载oil_spil.csv文件: ```python import kaggle kaggle.api.authenticate() kaggle.api.dataset_download_files('sauhaarda/oil-spill-dataset', unzip=True, path='.') ``` 这将在当前目录中下载并解压缩文件。 如果你想要下载指定版本的数据集,可以在dataset_download_files函数中使用version参数。 ### 回答2: 使用Python爬取Kaggle上的oil_spill.csv文件可以按照以下步骤进行: 1. 首先,需要安装kaggle和pandas库。可以使用以下命令安装: ``` pip install kaggle pandas ``` 2. 在Kaggle网站上创建一个账号,并在用户设置页的API部分中创建一个新的API Token,生成一个kaggle.json文件。将该文件保存在本地目录下,该文件包含了身份验证信息。 3. 在Python代码中引入必要的库和模块: ``` import os from kaggle.api.kaggle_api_extended import KaggleApi import pandas as pd ``` 4. 指定kaggle.json文件的路径,并初始化KaggleApi: ``` kaggle_json_path = "/path/to/kaggle.json" # 替换为实际的kaggle.json文件路径 api = KaggleApi() api.authenticate() ``` 5. 使用KaggleApi下载oil_spill数据集: ``` dataset = "imdevskp/oil-spill" data_dir = "/path/to/save/data" # 替换为实际保存数据的目录路径 api.dataset_download_files(dataset, path=data_dir, unzip=True) # 下载数据集并解压 ``` 6. 读取oil_spill.csv文件并通过pandas进行进一步的处理或分析: ``` data_file = os.path.join(data_dir, "oil_spill.csv") df = pd.read_csv(data_file) # 在此可以使用pandas的各种方法对数据进行处理和分析 ``` 以上是使用Python爬取Kaggle上的oil_spill.csv文件的代码示例,代码中需要替换为实际的文件路径和保存数据的目录路径。 ### 回答3: 要使用Python爬取Kaggle上的oil_spill.csv文件,我们可以使用以下代码: 首先,确保你已经安装了pandas和kaggle库。检查是否已经安装kaggle库,可以运行pip show kaggle,如果没有安装,可以运行pip install kaggle进行安装。 接下来,我们需要访问Kaggle的API,将API凭证文件下载到本地。 1. 在Kaggle网站上创建一个账号(如果还没有)。 2. 在个人资料页面中,找到“Create New API Token”按钮。 3. 点击按钮后,会下载一个名为“kaggle.json”的凭证文件。 将凭证文件保存在本地,并将其移动到~/.kaggle文件夹中。 然后,我们可以使用以下代码来获取并保存oils_spill.csv文件: ```python import kaggle import pandas as pd # 设置 Kaggle API 凭证路径 kaggle.api.config_path = "~/.kaggle/" # 下载数据集 kaggle.api.dataset_download_files('unitednations/international-maritime-piracy-2009-2013', unzip=True) # 读取 CSV 文件 df = pd.read_csv('oil_spill.csv') # 打印数据集前几行 print(df.head()) # 在这里可以进行其他数据处理的操作 ``` 以上代码首先设置了Kaggle API凭证的路径。然后,使用`kaggle.api.dataset_download_files`下载指定数据集(这里演示的是名为"unitednations/international-maritime-piracy-2009-2013"的数据集,你可以根据自己需要修改)。此处的参数`unzip=True`表示下载后的文件将被解压缩。 接下来,我们使用pandas的`read_csv`函数读取解压缩后的CSV文件,并将其保存在DataFrame中。你可以根据需要对数据进行进一步的处理。 最后,我们使用`df.head()`打印出DataFrame的前几行,以确认数据是否成功获取。 请注意,上述代码假设你在本地已配置好了Kaggle API,且凭证文件位于正确的路径中。否则,你需要根据自己的情况修改相应的路径设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值