介绍
鉴于Python在过去几年中的兴起及其简洁性,对于数据科学领域的Python学家意义重大。这篇文章会用最容易的方式引导你更快地构建第一个预测模型。
揭秘预测建模的过程
我一直专注于在模型构建的初始阶段投入质量时间,如假设生成/脑力激荡会议/讨论或理解领域。所有这些活动都帮助我解决问题,最终导致我设计出更强大的业务解决方案。有充分理由说明你应该事先花时间:
1. 你有足够的时间进行投资而且你很新鲜(它有影响力)
2. 您不会对其他数据点或想法产生偏见(我总是建议,在深入挖掘数据之前进行假设生成)
3. 在稍后阶段,您将急于完成项目并且无法花费高质量的时间
这个阶段需要一个高质量的时间,所以我不在这里提及时间表,我建议你把它作为标准做法。它将帮助您构建更好的预测模型,从而减少后期工作的迭代次数。让我们看看第一个模型构建中的剩余阶段和时间轴:
1. 对数据的描述性分析 - 50%的时间
2. 数据处理(缺失值和异常值修复) - 40%的时间
3. 数据建模 - 4%的时间
4. 性能评估 - 6%的时间
PS这是仅用于第一个模型构建的时间的分割
让我们一步一步地完成这个过程(估算每个步骤花费的时间):
第1阶段:描述性分析/数据探索:
作为数据科学家的最初几天,数据探索过去常常花费很多时间。随着时间的推移,已经对数据进行了大量自动化操作。鉴于数据准备占据了构建第一个模型的50%的工作,自动化的好处是显而易见的。可以查看" 7个数据探索步骤 "来查看最常见的数据探索操作。
Tavish在他的文章中已经提到,随着先进的机器学习工具的竞争,执行此任务所花费的时间已经大大减少。由于这是我们的第一个基准模型,我们不再使用任何类型的特征工程。因此,您可能需要进行描述性分析的时间仅限于知道缺失值和直接可见的大特征。在我的方法中,您需要2分钟才能完成此步骤(假设,数据集中有100,000个观察值)。
我为我的第一个模型执行的操作包括:
1. 识别ID,输入和目标功能
2. 识别分类和数字特征
3. 识别缺少值的列
第2阶段:数据处理(缺失值处理):
有各种方法来处理它。对于我们的第一个模型,我们将专注于智能和快速的技术来构建您的第一个有效模型(这些已经由Tavish在他的文章中讨论,我添加了一些方法)
· 为缺失值创建虚拟标志:它有效,有时缺失值本身带有大量信息。
· 使用均值/中位数/任何其他最简单的方法估算缺失值:平均值和中位数估算表现良好,大多数人更喜欢用平均值进行估算,但如果分布偏差,我建议您使用中位数。其他智能方法通过使用其他相关特征或构建模型的类似案例均值和中值插补来估算值。例如:在泰坦尼克号的生存挑战中,您可以使用乘客称呼来估算Age的缺失值,如"Mr.","Miss。","Mrs。","Master"等,这对模型性能有很好的影响。
· 估算分类变量的缺失值:创建一个新级别来归类分类变量,以便将所有缺失值编码为单个值,例如"New_Cat",或者您可以查看频率组合并使用具有更高频率的值来估算缺失值。
使用这种简单的数据处理方法,您可以将处理数据的时间缩短到3-4分钟。
阶段3.
:
建议使用任何一种 GBM / 随机森林技术,具体取决于业务问题。这两种技术对于创建基准解决方案非常有效。我见过数据科学家经常使用这两种方法作为他们的第一个模型,在某些情况下,它也可以作为最终模型。这将花费最长的时间(约4-5分钟)。
第4阶段。业绩估算:
有多种方法可以验证您的模型性能,我建议您将您的列车数据集划分为Train并验证(理想情况下为70:30)并根据70%的列车数据集构建模型。现在,使用30%的验证数据集对其进行交叉验证,并使用评估指标评估性能。这最终需要1-2分钟来执行和记录。
本文的目的不是为了赢得竞争,而是为自己建立一个基准。让我们看一下python代码来执行上述步骤,并构建您的第一个具有更高影响力的模型。
让我们开始付诸行动
我假设你已经完成了所有的假设生成,并且你对使用python的基础数据科学很好。我用数据科学挑战的例子来说明这一点。让我们来看看结构:
第1步:导入所需的库并读取测试和训练数据集。附加两者。
import pandas as pdimport numpy as npfrom sklearn.preprocessing import LabelEncoderimport randomfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.ensemble import GradientBoostingClassifiertrain=pd.read_csv('C:/Users/Analytics Vidhya/Desktop/challenge/Train.csv')test=pd.read_csv('C:/Users/Analytics Vidhya/Desktop/challenge/Test.csv')train['Type']='Train' #Create a flag for Train and Test Data settest['Type']='Test'fullData = pd.concat([train,test],axis=0) #Combined both Train and Test Data set
第2步:Python中不需要框架的第2步。到下一步。
第3步:查看数据集的列名称/摘要
fullData.columns # This will show all the column namesfullData.head(10) # Show first 10 records of dataframefullData.describe() #You can look at summary of numerical fields by using describe() function
步骤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'] #Test and Train Data set identifier
步骤5:识别具有缺失值的变量并为这些变量创建标志
fullData.isnull().any()#Will return the feature with True or False,True means have missing value else False
num_cat_cols = num_cols+cat_cols # Combined numerical and Categorical variables
#Create a new variable for each variable having missing value with VariableName_NA
# and flag missing value with 1 and other with 0
for var in num_cat_cols:
if fullData[var].isnull().any()==True:
fullData[var+'_NA']=fullData[var].isnull()*1
第6步:估算缺失值
#Impute numerical missing values with meanfullData[num_cols] = fullData[num_cols].fillna(fullData[num_cols].mean(),inplace=True)#Impute categorical missing values with -9999fullData[cat_cols] = fullData[cat_cols].fillna(value = -9999)
步骤7:为分类变量创建标签编码器并将数据集拆分为训练和测试,进一步将列车数据集拆分为训练和验证
#create label encoders for categorical featuresfor var in cat_cols: number = LabelEncoder() fullData[var] = number.fit_transform(fullData[var].astype('str'))#Target variable is also a categorical so convert itfullData["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)) <= .75Train, 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)].valuesy_train = Train["Account.Status"].valuesx_validate = Validate[list(features)].valuesy_validate = Validate["Account.Status"].valuesx_test=test[list(features)].valuesrandom.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_aucfinal_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'])
并提交!
结束笔记
希望这篇文章能让您开始编写自己的10分钟代码。Kaggle的大多数大师也是这么起步的。有问题和资料关注公众号“python_dada"。