zoukankan      html  css  js  c++  java
  • 如何用Python在10分钟内建立一个预测模型

     

    转载自:https://baijia.baidu.com/s?old_id=307995

    最近,我从孙子(指《孙子兵法》——译者注)那里学到了一些策略:速度和准备

    “兵之情主速,乘人之不及,由不虞之道,攻其所不戒也。”(《孙子兵法•九地篇》)无备为战之大患,有备无患,其乃至德也。(哈哈,译者自己写了这句,想必大家能明白。)

    这与数据科学博客有什么关系呢?这是你赢得竞争和编程马拉松的关键。如果你比竞争对手准备得更充分,你学习、迭代执行的速度越快,那么你就取得更好的名次,带来更好的结果。

    由于近几年来,Python用户数量上涨及其本身的简洁性,使得这个工具包对数据科学世界的Python专家们变得有意义。本文将帮助你更快更好地建立第一个预测模型。绝大多数优秀的数据科学家和kagglers建立自己的第一个有效模型并快速提交。这不仅仅有助于他们领先于排行榜,而且提供了问题的基准解决方案。

    预测模型的分解过程

    我总是集中于投入有质量的时间在建模的初始阶段,比如,假设生成、头脑风暴、讨论或理解可能的结果范围。所有这些活动都有助于我解决问题,并最终让我设计出更强大的商业解决方案。为什么你要在前面花费这段时间,这有充分的理由:

    你有足够的时间投入并且你是无经验的(这是有影响的)

    你不带有其它数据观点或想法的偏见(我总是建议,在深入研究数据之前做假设生成)

    在后面的阶段,你会急于完成该项目而没有能力投入有质量的时间了。

    这个阶段需要投入高质量时间,因此我没有提及时间表,不过我建议你把它作为标准的做法。这有助于你建立建立更好地预测模型,在后面的阶段的只需较少的迭代工作。让我们来看看建立第一个模型的剩余阶段的时间表:

    数据描述性分析——50%的时间

    数据预处理(缺失值和异常值修复)——40%的时间

    数据建模——4%的时间

    性能预测——6%的时间

    让我们一步一步完成每个过程(每一步投入预测的时间):

    阶段1:描述性分析/数据探索

    在我刚开始成为数据科学家的时候,数据探索占据了我大量的时间。不过,随着时间的推移,我已经把大量的数据操作自动化了。由于数据准备占据建立第一个模型工作量的50%,自动化的好处是显而易见的。

    这是我们的第一个基准模型,我们去掉任何特征设计。因此,描述分析所需的时间仅限于了解缺失值和直接可见的大的特征。在我的方法体系中,你将需要2分钟来完成这一步(假设,100000个观测数据集)。

    我的第一个模型执行的操作:

    确定ID,输入特征和目标特征

    确定分类和数值特征

    识别缺失值所在列

    阶段2:数据预处理(缺失值处理)

    有许多方法可以解决这个问题。对于我们的第一个模型,我们将专注于智能和快速技术来建立第一个有效模型。

    为缺失值创建假标志:有用,有时缺失值本身就携带了大量的信息。

    用均值、中位数或其它简单方法填补缺失值:均值和中位数填补都表现良好,大多数人喜欢用均值填补但是在有偏分布的情况下我建议使用中位数。其它智能的方法与均值和中位数填补类似,使用其它相关特征填补或建立模型。比如,在Titanic生存挑战中,你可以使用乘客名字的称呼,比如:“Mr.”, “Miss.”,”Mrs.”,”Master”,来填补年龄的缺失值,这对模型性能有很好的影响。

    填补缺失的分类变量:创建一个新的等级来填补分类变量,让所有的缺失值编码为一个单一值比如,“New_Cat”,或者,你可以看看频率组合,使用高频率的分类变量来填补缺失值。

    由于数据处理方法如此简单,你可以只需要3到4分钟来处理数据。

    阶段3:数据建模

    根据不同的业务问题,我推荐使用GBM或RandomForest技术的任意一种。这两个技术可以极其有效地创建基准解决方案。我已经看到数据科学家通常把这两个方法作为他们的第一个模型同时也作为最后一个模型。这最多用去4到5分钟。

    阶段4:性能预测

    有各种各样的方法可以验证你的模型性能,我建议你将训练数据集划分为训练集和验证集(理想的比例是70:30)并且在70%的训练数据集上建模。现在,使用30%的验证数据集进行交叉验证并使用评价指标进行性能评估。最后需要1到2分钟执行和记录结果。

    本文的目的不是赢得比赛,而是建立我们自己的基准。让我们用python代码来执行上面的步骤,建立你的第一个有较高影响的模型。

    让我们开始付诸行动

    首先我假设你已经做了所有的假设生成并且你擅长使用python的基本数据科学操作。我用一个数据科学挑战的例子来说明。让我们看一下结构:

    步骤1:导入所需的库,读取测试和训练数据集。

    #导入pandas、numpy包,导入LabelEncoder、random、RandomForestClassifier、GradientBoostingClassifier函数

    import pandas as pd
    
    import numpy as np
    
    from sklearn.preprocessing import LabelEncoder
    
    import random
    
    from sklearn.ensemble import RandomForestClassifier
    
    from sklearn.ensemble import GradientBoostingClassifier

    #读取训练、测试数据集

    train=pd.read_csv('C:/Users/AnalyticsVidhya/Desktop/challenge/Train.csv')
    
    test=pd.read_csv('C:/Users/AnalyticsVidhya/Desktop/challenge/Test.csv')

    #创建训练、测试数据集标志

    train['Type']='Train'
    
    test['Type']='Test'
    
    fullData =pd.concat([train,test],axis=0) #联合训练、测试数据集

    步骤2:该框架的第二步并不需要用到python,继续下一步。

    步骤3:查看数据集的列名或概要

    fullData.columns # 显示所有的列名称
    
    fullData.head(10) #显示数据框的前10条记录
    
    fullData.describe() #你可以使用describe()函数查看数值域的概要

    步骤4:确定a)ID变量 b)目标变量 c)分类变量 d)数值变量 e)其他变量。

    ID_col = ['REF_NO']
    
    target_col = ["Account.Status"]
    
    cat_cols =
    
    ['children','age_band','status','occupation','occupation_partner','home_status','family_income','self_employed', 'self_employed_partner','year_last_moved','TVarea','post_code','post_area','gender','region']
    
    num_cols= list(set(list(fullData.columns))-set(cat_cols)-set(ID_col)-set(target_col)-set(data_col))other_col=['Type'] #为训练、测试数据集设置标识符

    步骤5:识别缺失值变量并创建标志

    fullData.isnull().any()#返回True或False,True意味着有缺失值而False相反
    
    num_cat_cols = num_cols+cat_cols # 组合数值变量和分类变量
    
    #为有缺失值的变量创建一个新的变量# 对缺失值标志为1,否则为0
    
    for var in num_cat_cols:   
    
    if fullData[var].isnull().any()==True:
    
    fullData[var+'_NA']=fullData[var].isnull()*1

    步骤6:填补缺失值

    #用均值填补数值缺失值
    
    fullData[num_cols] = fullData[num_cols].fillna(fullData[num_cols].mean(),inplace=True)
    
    #用-9999填补分类变量缺失值
    
    fullData[cat_cols] = fullData[cat_cols].fillna(value = -9999)

    步骤7:创建分类变量的标签编码器,将数据集分割成训练和测试集,进一步,将训练数据集分割成训练集和测试集。

    #创建分类特征的标签编码器
    
    for var in cat_cols:
    
    number = LabelEncoder()
    
    fullData[var] = number.fit_transform(fullData[var].astype('str'))
    
     
    
    #目标变量也是分类变量,所以也用标签编码器转换
    
    fullData["Account.Status"] = number.fit_transform(fullData["Account.Status"].astype('str'))
    
     
    
    train=fullData[fullData['Type']=='Train']
    
    test=fullData[fullData['Type']=='Test']
    
    train['is_train'] = np.random.uniform(0, 1, len(train)) <= .75
    
    Train, Validate = train[train['is_train']==True], train[train['is_train']==False]

    步骤8:将填补和虚假(缺失值标志)变量传递到模型中,我使用随机森林来预测类。

    features=list(set(list(fullData.columns))-set(ID_col)-set(target_col)-set(other_col))
    
    x_train = Train[list(features)].values
    
    y_train = Train["Account.Status"].values
    
    x_validate = Validate[list(features)].values
    
    y_validate = Validate["Account.Status"].values
    
    x_test=test[list(features)].values
    
    random.seed(100)
    
    rf = RandomForestClassifier(n_estimators=1000)
    
    rf.fit(x_train, y_train)

    步骤9:检查性能做出预测

    status = rf.predict_proba(x_validate)
    
    fpr, tpr, _ = roc_curve(y_validate, status[:,1])
    
    roc_auc = auc(fpr, tpr)
    
    print roc_auc
    
    final_status = rf.predict_proba(x_test)
    
    test["Account.Status"]=final_status[:,1]
    
    test.to_csv('C:/Users/Analytics Vidhya/Desktop/model_output.csv',columns=
    
    ['REF_NO','Account.Status'])

    现在可以提交了!

  • 相关阅读:
    hdu 1028 Ignatius and the Princess III (n的划分)
    CodeForces
    poj 3254 Corn Fields (状压DP入门)
    HYSBZ 1040 骑士 (基环外向树DP)
    PAT 1071 Speech Patterns (25)
    PAT 1077 Kuchiguse (20)
    PAT 1043 Is It a Binary Search Tree (25)
    PAT 1053 Path of Equal Weight (30)
    c++ 常用标准库
    常见数学问题
  • 原文地址:https://www.cnblogs.com/wanglei0103/p/7236018.html
Copyright © 2011-2022 走看看