python数据分析和预测

如果您完成了第1部分 ,那么恭喜! 您有耐心格式化数据。 在那篇文章中,我使用了一些Python库和一些基本的足球知识来清理我的国家橄榄球联盟数据集 。 从我离开的地方开始,是时候仔细看看我的数据集了。

数据分析

我将创建一个仅包含要使用的数据字段的最终数据框。 这些主要是除向下和距离(aka yardsToGo )外,我在转换列时创建的数据字段。

df_final 
     
     = df 
     
     [ 
     
     [ 
     
     'down' 
     
     , 
     
     'yardsToGo' 
     
     , 
     
     'yardsToEndzone' 
     
     , 
     
     'rb_count' 
     
     , 
     
     'te_count' 
     
     , 
     
     'wr_count' 
     
     , 
     
     'ol_count' 
     
     , 
     
     

               
     
     'db_count' 
     
     , 
     
     'secondsLeftInHalf' 
     
     , 
     
     'half' 
     
     , 
     
     'numericPlayType' 
     
     , 
     
     'numericFormation' 
     
     , 
     
     'play_type' 
     
     ] 
     
     ]

现在,我想使用dataframe.describe()来检查我的数据。 它可以对数据框中的数据进行汇总,从而更容易发现任何异常值。

print ( df_final. describe ( include = 'all' ) ) 
print ( df_final. describe ( include = 'all' ) )

用python根据现有数据进行销量预测 python数据分析预测_人工智能

除了yardsToEndzone的计数比其余各列的计数低之外,大多数内容看起来都不错。 dataframe.describe()文档将计数返回值定义为“非NA /空观测值的数量”。 我需要检查我是否有空的码线值。

print ( df. yardlineNumber . unique ( ) ) 
print ( df. yardlineNumber . unique ( ) )

用python根据现有数据进行销量预测 python数据分析预测_深度学习_02

为什么会有nan值? 为什么我似乎缺少一条50码的线? 如果我不了解,我会说我从NFL转储中得到的未稀释数据实际上并没有使用50码线作为值,而是将其标记为nan。

以下是一些码数为NA的比赛的比赛描述:

用python根据现有数据进行销量预测 python数据分析预测_python_03

看来我的假设是正确的。 每个比赛描述的结束码和获得的码数均为50。完美(为什么?!)。 我将从上次在yards_to_endzone函数之前添加一行来将这些nan值映射到50。

df [ 'yardlineNumber' ] = df [ 'yardlineNumber' ] . fillna ( 50 ) 
df [ 'yardlineNumber' ] = df [ 'yardlineNumber' ] . fillna ( 50 )

用python根据现有数据进行销量预测 python数据分析预测_深度学习_04

再次运行df_final.describe() ,我现在全面获得了统一计数。 谁知道如此大量的实践只是在研究数据? 当它带有神秘感时,我会更喜欢它。

是时候开始我的可视化了。 Seaborn是一个有用的用于绘制数据的库,我已经在第1部分中将其导入。

播放类型

完整数据集中有多少场传球和奔跑?

sns. 
     
     catplot 
     
     ( x 
     
     = 
     
     'play_type' 
     
     , kind 
     
     = 
     
     'count' 
     
     , data 
     
     = df_final 
     
     , orient 
     
     = 
     
     'h' 
     
     ) 
     
     

plt. 
     
     show 
     
     ( 
     
     )

用python根据现有数据进行销量预测 python数据分析预测_用python根据现有数据进行销量预测_05

看起来传球比奔跑的游戏多出1000多个。 这很重要,因为这意味着两种播放类型之间的分配不是50/50的分配。 默认情况下,每个分组的传球次数应比跑步次数多一些。

丘陵

失败是指球队可以尝试比赛的时期。 在NFL中,进攻要经过四次尝试(称为“下降”)才能获得指定的码数(通常从10码开始)。 如果没有,则必须将球传给对手。 是否有特定的下降趋势,往往会有更多的传球或奔跑(也称为奔跑)?

sns. 
     
     catplot 
     
     ( x 
     
     = 
     
     "down" 
     
     , kind 
     
     = 
     
     "count" 
     
     , hue 
     
     = 
     
     'play_type' 
     
     , data 
     
     = df_final 
     
     ) 
     
     ; 
     
     

plt. 
     
     show 
     
     ( 
     
     )

用python根据现有数据进行销量预测 python数据分析预测_机器学习_06

第三局比传球要多得多,但考虑到初始数据的分布,这可能毫无意义。

回归

我可以使用numericPlayType列来发挥自己的优势,并创建一个回归图以查看是否存在任何趋势。

sns. 
     
     lmplot 
     
     ( x 
     
     = 
     
     "yardsToGo" 
     
     , y 
     
     = 
     
     "numericPlayType" 
     
     , data 
     
     = df_final 
     
     , y_jitter 
     
     = 
     
     .03 
     
     , logistic 
     
     = 
     
     True 
     
     , aspect 
     
     = 
     
     2 
     
     ) 
     
     ; 
     
     

plt. 
     
     show 
     
     ( 
     
     )

用python根据现有数据进行销量预测 python数据分析预测_人工智能_07

这是一个基本的回归图,表示走的码数越大,数字游戏类型就越大。 如果播放类型为0进行奔跑,传递类型为1进行传球,则这意味着要覆盖的距离越远,该播放就越可能成为传递类型。

模型训练

我将使用XGBoost进行培训; 它要求输入数据必须全部为数字(因此,我必须删除可视化中使用的play_type列)。 我还需要将数据分为训练,验证和测试子集。

train_df 
     
     , validation_df 
     
     , test_df 
     
     = np. 
     
     split 
     
     ( df_final. 
     
     sample 
     
     ( frac 
     
     = 
     
     1 
     
     ) 
     
     , 
     
     [ 
     
     int 
     
     ( 
     
     0.7 * 
     
     len 
     
     ( df 
     
     ) 
     
     ) 
     
     , 
     
     int 
     
     ( 
     
     0.9 * 
     
     len 
     
     ( df 
     
     ) 
     
     ) 
     
     ] 
     
     ) 
     
     


print 
     
     ( 
     
     "Training size is %d, validation size is %d, test size is %d" % 
     
     ( 
     
     len 
     
     ( train_df 
     
     ) 
     
     , 
     
     

                                                                           
     
     len 
     
     ( validation_df 
     
     ) 
     
     , 
     
     

                                                                           
     
     len 
     
     ( test_df 
     
     ) 
     
     ) 
     
     )

用python根据现有数据进行销量预测 python数据分析预测_机器学习_08

XGBoost采用特定的数据结构格式的数据,我可以使用DMatrix函数创建该格式 。 基本上,我将numericalPlayType声明为要预测的标签,因此我将向该数据集提供没有该列的干净数据集。

train_clean_df 
     
     = train_df. 
     
     drop 
     
     ( columns 
     
     = 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     ) 
     
     

d_train 
     
     = xgb. 
     
     DMatrix 
     
     ( train_clean_df 
     
     , label 
     
     = train_df 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     , 
     
     

                      feature_names 
     
     = 
     
     list 
     
     ( train_clean_df 
     
     ) 
     
     ) 
     
     



val_clean_df 
     
     = validation_df. 
     
     drop 
     
     ( columns 
     
     = 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     ) 
     
     

d_val 
     
     = xgb. 
     
     DMatrix 
     
     ( val_clean_df 
     
     , label 
     
     = validation_df 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     , 
     
     

                    feature_names 
     
     = 
     
     list 
     
     ( val_clean_df 
     
     ) 
     
     ) 
     
     



eval_list 
     
     = 
     
     [ 
     
     ( d_train 
     
     , 
     
     'train' 
     
     ) 
     
     , 
     
     ( d_val 
     
     , 
     
     'eval' 
     
     ) 
     
     ] 
     
     

results 
     
     = 
     
     { 
     
     }

其余设置需要一些参数调整。 不必太草率 ,预测运行/通过是一个二进制问题,我应该将目标设置为binary.logistic 。 有关XGBoost所有参数的更多信息,请参阅其文档 。

param 
     
     = 
     
     { 
     
     

    
     
     'objective' : 
     
     'binary:logistic' 
     
     , 
     
     

    
     
     'eval_metric' : 
     
     'auc' 
     
     , 
     
     

    
     
     'max_depth' : 
     
     5 
     
     , 
     
     

    
     
     'eta' : 
     
     0.2 
     
     , 
     
     

    
     
     'rate_drop' : 
     
     0.2 
     
     , 
     
     

    
     
     'min_child_weight' : 
     
     6 
     
     , 
     
     

    
     
     'gamma' : 
     
     4 
     
     , 
     
     

    
     
     'subsample' : 
     
     0.8 
     
     , 
     
     

    
     
     'alpha' : 
     
     0.1 
     
     
}

针对我的PC的一些侮辱性侮辱,以及后来的两部分系列( Python的哭泣 ),我正式准备训练我的模型! 我将尽早停止一轮,这意味着如果模型训练的评估指标在八轮之后下降,我将结束训练。 这有助于防止过度拟合 。 预测结果表示为结果为1(传球)的概率。

num_round 
     
     = 
     
     250 
     
     

xgb_model 
     
     = xgb. 
     
     train 
     
     ( param 
     
     , d_train 
     
     , num_round 
     
     , eval_list 
     
     , early_stopping_rounds 
     
     = 
     
     8 
     
     , evals_result 
     
     = results 
     
     ) 
     
     



test_clean_df 
     
     = test_df. 
     
     drop 
     
     ( columns 
     
     = 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     ) 
     
     

d_test 
     
     = xgb. 
     
     DMatrix 
     
     ( test_clean_df 
     
     , label 
     
     = test_df 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     , 
     
     

                     feature_names 
     
     = 
     
     list 
     
     ( test_clean_df 
     
     ) 
     
     ) 
     
     



actual 
     
     = test_df 
     
     [ 
     
     'numericPlayType' 
     
     ] 
     
     

predictions 
     
     = xgb_model. 
     
     predict 
     
     ( d_test 
     
     ) 
     
     
print 
     
     ( predictions 
     
     [ : 
     
     5 
     
     ] 
     
     )

用python根据现有数据进行销量预测 python数据分析预测_python_09

我想看看我的模型使用四舍五入的预测(到0或1)和scikit-learn的指标包的准确性。

rounded_predictions 
     
     = np. 
     
     round 
     
     ( predictions 
     
     ) 
     
     


accuracy 
     
     = metrics. 
     
     accuracy_score 
     
     ( actual 
     
     , rounded_predictions 
     
     ) 
     
     

print 
     
     ( 
     
     "Metrics: \n Accuracy: %.4f" % 
     
     ( accuracy 
     
     ) 
     
     )

用python根据现有数据进行销量预测 python数据分析预测_用python根据现有数据进行销量预测_10

使用Python及其丰富的库和模型,我可以合理地预测播放类型的结果。 但是,仍有一些我没有考虑的因素。 国防人员对比赛类型有什么影响? 比赛时的得分差异如何? 我想总是有空间检查您的数据并进行改进。 las,这就是程序员变成数据科学家的生活。 是时候考虑提前退休了。

翻译自: https://opensource.com/article/19/10/predicting-nfl-plays-python

python数据分析和预测