由于时效问题,该文某些代码、技术可能已经过期,请注意!!!本文最后更新于:4 年前
                
              
            
            
              结构化数据 1 2 3 4 5 6 7 8 9 10 import os%Y -%m -%d  %H :%M :%S ')print ("\n" +"==========" *8  + "%s" %nowtime )"KMP_DUPLICATE_LIB_OK" ]="TRUE"  
一,准备数据 titanic数据集的目标是根据乘客信息预测他们在Titanic号撞击冰山沉没后能否生存。
结构化数据一般会使用Pandas中的DataFrame进行预处理。
1 2 3 4 5 6 7 8 9 10 import numpy as  np as  pd as  plt_csv('/ home / kesci / input / data6936 / data / titanic / train .csv ') _csv('/ home / kesci / input / data6936 / data / titanic / test .csv ') 10 )
利用Pandas的数据可视化功能我们可以简单地进行探索性数据分析EDA(Exploratory Data Analysis)。
label分布情况
1 2 3 4 5 6 7 %matplotlib inline.value_counts () .plot (kind  = 'bar',      figsize  = (12,8) ,fontsize=15,rot = 0)set _ylabel('Counts',fontsize  = 15) set _xlabel('Survived',fontsize  = 15) () 
数据预处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 def preprocessing(dfdata):DataFrame ()Pclass 'Pclass' ])'Pclass_'  +str(x) for x in dfPclass.columns ]1 )Sex 'Sex' ])1 )Age 'Age' ] = dfdata['Age' ].fillna(0 )'Age_null' ] = pd.isna(dfdata['Age' ]).astype('int32' )SibSp ,Parch ,Fare 'SibSp' ] = dfdata['SibSp' ]'Parch' ] = dfdata['Parch' ]'Fare' ] = dfdata['Fare' ]Carbin 'Cabin_null' ] =  pd.isna(dfdata['Cabin' ]).astype('int32' )Embarked 'Embarked' ],dummy_na=True )'Embarked_'  + str(x) for x in dfEmbarked.columns]1 )'Survived' ]].values'Survived' ]].values"x_train.shape =" , x_train.shape )"x_test.shape =" , x_test.shape )"y_train.shape =" , y_train.shape )"y_test.shape =" , y_test.shape )
进一步使用DataLoader和TensorDataset封装成可以迭代的数据管道。
1 2 3 4 dl_train = DataLoader(TensorDataset (torch .tensor(x_train ).float(),torch.tensor(y_train ).float()),8 )TensorDataset (torch .tensor(x_test ).float(),torch.tensor(y_test ).float()),8 )
1 2 3 4 # 测试数据管道for  features ,labels  in  dl_train:print (features ,labels )break 
二,定义模型 使用Pytorch通常有三种方式构建模型:使用nn.Sequential按层顺序构建模型,继承nn.Module基类构建自定义模型,继承nn.Module基类构建模型并辅助应用模型容器进行封装。
此处选择使用最简单的nn.Sequential,按层顺序模型。
1 2 3 4 5 6 7 8 9 10 11 12 def create_net():Sequential ()add_module ("linear1" ,nn.Linear (15 ,20 ))add_module ("relu1" ,nn.ReLU ())add_module ("linear2" ,nn.Linear (20 ,15 ))add_module ("relu2" ,nn.ReLU ())add_module ("linear3" ,nn.Linear (15 ,1 ))add_module ("sigmoid" ,nn.Sigmoid ())create_net ()print (net)
1 2 from  torchkeras import  summary summary (net,input_shape=(15 ,))
三,训练模型 Pytorch通常需要用户编写自定义训练循环,训练循环的代码风格因人而异。
有3类典型的训练循环代码风格:脚本形式训练循环,函数形式训练循环,类形式训练循环。
此处介绍一种较通用的脚本形式。
1 2 3 4 5 6 from sklearn.metrics import accuracy_scoreBCELoss() Adam(params =net .parameters () ,lr = 0.01 )_score(y_true .data .numpy () ,y_pred.data.numpy() >0.5 )"accuracy" 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 epochs = 10 30 columns  = ["epoch" ,"loss" ,metric_name,"val_loss" ,"val_" +metric_name]) print ("Start Training..." )%m -%d %H:%M:%S')print ("==========" *8  + "%s" %nowtime)for  epoch in  range (1 ,epochs+1 ):  1 ,训练循环-------------------------------------------------0.0 0.0 step  = 1 for  step , (features ,labels ) in  enumerate(dl_train, 1 ):features )labels )labels )step ()batch 级别日志if  step%log_step_freq == 0 :   print (("[step = %d] loss: %.3f, " +metric_name+": %.3f" ) % step , loss_sum/step , metric_sum/step ))2 ,验证循环-------------------------------------------------eval ()0.0 0.0 1 for  val_step, (features ,labels ) in  enumerate(dl_valid, 1 ):features )labels )labels )3 ,记录日志-------------------------------------------------step , metric_sum/step , 1 ] = infoprint (("\nEPOCH = %d, loss = %.3f," + metric_name + \"  = %.3f, val_loss = %.3f, " +"val_" + metric_name+" = %.3f" ) %m -%d %H:%M:%S')print ("\n" +"==========" *8  + "%s" %nowtime)print ('Finished Training...')
四,评估模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 %matplotlib inline'svg' import  matplotlib.pyplot as  pltdef  plot_metric (dfhistory, metric ):'val_' +metric]range (1 , len (train_metrics) + 1 )'bo--' )'ro-' )'Training and validation ' + metric)"Epochs" )"train_" +metric, 'val_' +metric])"loss" )"accuracy" )
五,使用模型 1 2 3 4 5 6 7 8 #预测概率.tensor (x_test[0:10] ).float ()).data .where (y_pred_probs>0.5 ,.ones_like (y_pred_probs),torch.zeros_like (y_pred_probs))
六,保存模型 Pytorch 有两种保存模型的方式,都是通过调用pickle序列化方法实现的。
第一种方法只保存模型参数。
第二种方法保存完整模型。
推荐使用第一种,第二种方法可能在切换设备和目录的时候出现各种问题。
1 print (net.state_dict() .keys ())
1 2 3 4 5 6 7 8 # 保存模型参数_dict() , "./data/net_parameter.pkl" )_net() _state_dict(torch .load ("./data/net_parameter.pkl" ) )[0 :10 ] ).float () ).data
搬运自: