前言评价一个算法的好坏,我觉得关键是看它能不能解决问题。如果算法能很好的解决实际问题,那我觉得是个好算法。比如预测算法,关键是看预测的准确率,即预测值与实际值的接近程度,而不是算法本身的得分。文章中,使用线性回归算法,我预测2019年双11交易额为2471亿元,而阿里官方公布的实际交易额为2684亿元,预测值少了7.9%比实际值。这个结果,我觉得准确率不够高。反思预测过程,我认为可以从以下几个方面进行改进。1.样本为了简化算法模型,我舍弃了往年比较少的数据,只保留最近5年的数据。当数据量本身比较小的时候,我还是遵循简单的原则,无形中增加了算法不稳定的风险和欠拟合的问题。虽然算法的分数高,但是分数高并不代表算法好。因此,样本的选择非常重要,不能单纯追求算法的高分而忽视样本的质量。2、如果算法保留所有样本,很明显数据的规律不是线性的,多项式回归算法应该是更好的选择。假如用三次多项式回归算法进行预测,那么算法代码如下:#导入所需的库importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.linear_modelimportLinearRegressionfromsklearn.preprocessingimportPolynomialFeaturesfromsklearn.pipelineimportPipelinefromsklearn.preprocessingimportStandardScaler#内嵌画图%matplotlibinline#设置正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']#Readthedataandreply"1111"inLinJi's公众号backgrounddf=pd.read_excel('./data/1111.xlsx')#xYearx=np.array(df.iloc[:,0]).reshape(-1,1)#ytransactionamounty=np.array(df.iloc[:,1])#zpredictedyearz=[[2019]]#Callthepolynomialregressionalgorithminapipelinepoly_reg=Pipeline([('ploy',PolynomialFeatures(degree=3)),('std_scaler',StandardScaler()),('lin_reg',LinearRegression())])poly_reg.fit(x,y)#Usethealgorithmtopredictpredict=poly_reg.predict(z)#Outputtheforecastresultprint('PredictthetransactionvolumeofDouble11in2019',str(round(predict[0],0)),'100millionyuan.')print('Scoreoflinearregressionalgorithm:',poly_reg.score(x,y))predictsthatthetransactionvolumeofDouble11in2019willbe268.90billionyuan.线性回归算法得分:0.99939752363314下面是用matplotlib作图的代码:#可视化数据,设置图像大小fig=plt.figure(figsize=(10,8))ax=fig.add_subplot(111)#Draw散点图ax.scatter(x,y,color='#0085c3',s=100)ax.scatter(z,predict,color='#dc5034',marker='*',s=260)#设置标签和其他plt。xlabel('year',fontsize=20)plt.ylabel('双11交易量',fontsize=20)plt.tick_params(labelsize=20)#绘制预测直线x2=np.concatenate([x,z])y2=poly_reg.predict(x2)plt.plot(x2,y2,'-',c='#7ab800')plt.title('利用多项式回归预测双11交易量',fontsize=26)plt.show()这几乎完美地拟合了从2009年开始的十一年的数据,不禁让人怀疑阿里的数据是不是太完美了?3.优化按照一般的机器学习算法流程,数据应该被分成两部分,分别称为训练数据集和测试数据集。2009年到2018年,双11的交易额只有10个数字,我做预测的时候去掉了前5个数字,只剩下5个数字。我认为没有必要拆分它们。但是机器学习算法的性能有一个关键因素,就是要有足够的数据量。此外,应适当使用网格搜索法对算法参数进行优化,必要时结合交叉验证法对算法进行评价,以提高算法的可信度和准确性。除了算法的准确性外,还可以使用其他方法来评估模型,如:召回率、F1分数、ROC、AUC、MSE、RMSE、MAE等。现实世界错综复杂,很难用算法解决问题。往往要经过多次尝试才能找到基本适合的模型。需要注意的是,多项式回归的指标不能太高,否则算法过于复杂,容易出现“过拟合”现象,泛化能力比较差,也就是能很好地拟合对训练数据集,但是对测试数据集的预测误差比较大。模型复杂度与预测误差的大致关系如下图所示:总结这篇文章是我用线性回归算法预测双11交易量后的回顾,总结了改进的思路,学习了优化方法。学以致用是我学习的基本原则。如果你害怕犯错,没有勇气去实践,那么学习再多的算法又有什么用呢?这就像我们不下水就不能指望学会游泳一样。希望以上能给你启发。
