数据挖掘入门-以二手车价格预测为例_第1页
数据挖掘入门-以二手车价格预测为例_第2页
数据挖掘入门-以二手车价格预测为例_第3页
数据挖掘入门-以二手车价格预测为例_第4页
数据挖掘入门-以二手车价格预测为例_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据挖掘⼊门——以⼆⼿车价格预测为例数据挖掘⼊门——以⼆⼿车价格预测为例作者:张杰数据挖掘的步骤DataAnalysisFeatureEngineeringFeatureSelectionModelBuildingModelDeployment1.DataAnalysis对于数据分析部分,需要探索以下⼏个点:1)MissingValues2)AllTheNumericalVariables3)DistributionoftheNumericalVariables4)CategoricalVariables5)CardinalityofCategoricalVariables6)OutliersRelationshipbetweenindependentanddependentfeature(SalePrice)2.FeatureEngineering数据和特征决定了机器学习的上限,⽽模型和算法只是逼近这个上限⽽已。那特征⼯程到底是什么呢?顾名思义,其本质是⼀项⼯程活动,⽬的是最⼤限度地从原始数据中提取特征以供算法和模型使⽤。特征⼯程中可能有以下问题:不属于同⼀量纲:即特征的规格不⼀样,不能够放在⼀起⽐较;定性特征不能直接使⽤:某些机器学习算法和模型只能接受定量特征的输⼊,那么需要将定性特征转换为定量特征。最简单的⽅式是为每⼀种定性值指定⼀个定量值,但是这种⽅式过于灵活,增加了调参的⼯作。通常使⽤哑编码的⽅式将定性特征转换为定量特征:假设有N种特征,当原始特征值为第i种定性值时,第i个扩展特征为1,其他扩展特征赋值为0。哑编码的⽅式相⽐直接指定的⽅式,不⽤增加调参的⼯作,对于线性模型来说,使⽤哑编码的特征可达到⾮线性的效果;存在缺失值:缺失值需要补充;信息利⽤率低:不同的机器学习算法和模型对数据中信息的利⽤是不同的,之前提到在线性模型中,使⽤对定性特征哑编码可以达到⾮线性的效果。类似地,对定量变量多项式化,或者进⾏其他的转换,都能达到⾮线性的效果。特别地,需要重点关注缺失值的处理,异常值的处理,数据归⼀化,数据编码等关键问题。3.FeatureSelection特征选择意味着选择那些在我们的模型上可以提⾼性能的特征变量。可以使⽤了⼀些机器学习和统计⽅法来选择最有相关的特征来改进模型性能。4.ModelBuilding模型部分通常可以选择机器学习模型,也可以选择使⽤深度学习模型,特别地,很多时候模型集成往往有着出⼈意料的效果。赛题分析赛题数据评测标准评价标准为MAE(MeanAbsoluteError)。导⼊基本模块#基础⼯具importnumpyasnpimportpandasaspdimportwarningsimportmatplotlibimportmatplotlib.pyplotaspltimportseabornassnsfromscipy.specialimportjnfromIPython.displayimportdisplay,clear_outputimporttimefromtqdmimporttqdmimportitertoolswarnings.filterwarnings('ignore')%matplotlibinline##模型预测的fromsklearnimportlinear_modelfromsklearnimportpreprocessingfromsklearn.svmimportSVRfromsklearn.ensembleimportRandomForestRegressor,GradientBoostingRegressor##数据降维处理的fromsklearn.decompositionimportPCA,FastICA,FactorAnalysis,SparsePCA##参数搜索和评价的fromsklearn.model_selectionimportGridSearchCV,cross_val_score,StratifiedKFold,train_test_splitfromsklearn.metricsimportmean_squared_error,mean_absolute_errorimportscipy.signalassignal数据分析与特征⼯程defreduce_mem_usage(df):"""iteratethroughallthecolumnsofadataframeandmodifythedatatypetoreducememoryusage."""start_mem=df.memory_usage().sum()print('Memoryusageofdataframeis{:.2f}MB'.format(start_mem))forcolindf.columns:col_type=df[col].dtypeifcol_type!=object:c_min=df[col].min()c_max=df[col].max()ifstr(col_type)[:3]=='int':ifc_min>np.iinfo(8).minandc_max<np.iinfo(8).max:df[col]=df[col].astype(8)elifc_min>np.iinfo(16).minandc_max<np.iinfo(16).max:df[col]=df[col].astype(16)elifc_min>np.iinfo(32).minandc_max<np.iinfo(32).max:df[col]=df[col].astype(32)elifc_min>np.iinfo(64).minandc_max<np.iinfo(64).max:df[col]=df[col].astype(64)else:ifc_min>np.finfo(np.float16).minandc_max<np.finfo(np.float16).max:df[col]=df[col].astype(np.float16)elifc_min>np.finfo(np.float32).minandc_max<np.finfo(np.float32).max:df[col]=df[col].astype(np.float32)else:df[col]=df[col].astype(np.float64)else:df[col]=df[col].astype('category')end_mem=df.memory_usage().sum()print('Memoryusageafteroptimizationis:{:.2f}MB'.format(end_mem))print('Decreasedby{:.1f}%'.format(100*(start_mem-end_mem)/start_mem))returndfTrain_data=reduce_mem_usage(pd.read_csv('used_car_train_20200313.csv',sep=''))Test_data=reduce_mem_usage(pd.read_csv('used_car_testB_20200421.csv',sep=''))##输出数据的⼤⼩信息print('Traindatashape:',Train_data.shape)print('TestAdatashape:',Test_data.shape)image.png#合并数据集concat_data=pd.concat([Train_data,Test_data])concat_data.isnull().sum()image.png这⾥我们发现bodyType,fuelType和gearbox缺失⽐较多,model缺失⼀⾏,price由于是输出,这⾥不⽤额外处理。分析V系列匿名特征和⾮V系列特征对于匿名变量来说,只有数值信息,需要更多关注到,这⾥把变量分为匿名变量和⾮匿名变量,单独进⾏分析concat_data.columnsimage.png⾸先提取⾮匿名变量进⾏分析,随机抽样10⾏数据.concat_data[['bodyType','brand','creatDate','fuelType','gearbox','kilometer','model','name','notRepairedDamage','offerType','power','regDate','regionCode','seller']].sample(10)image.pngconcat_data[['bodyType','brand','creatDate','fuelType','gearbox','kilometer','model','name','notRepairedDamage','offerType','power','regDate','regionCode','seller']].describe()image.png这⾥发现了列名为notRepairedDamage的取值中包含了"-"的异常值,这⾥使⽤众数进⾏替换concat_data['notRepairedDamage'].value_counts()image.pngconcat_data['notRepairedDamage']=concat_data['notRepairedDamage'].replace('-',0).astype('float16')接着继续分析匿名变量concat_data[['v_0','v_1','v_2','v_3','v_4','v_5','v_6','v_7','v_8','v_9','v_10','v_11','v_12','v_13','v_14']].sample(10)image.pngconcat_data[['v_0','v_1','v_2','v_3','v_4','v_5','v_6','v_7','v_8','v_9','v_10','v_11','v_12','v_13','v_14']].describe()image.png对于缺失值,先简单的使⽤众数进⾏填充。填充完后,数据中不再含有缺失值。concat_data=concat_data.fillna(concat_data.mode().iloc[0,:])print('concat_datashape:',concat_data.shape)concat_data.isnull().sum()image.png对离散型数值进⾏独热编码对于每⼀个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个⼆元特征(如成绩这个特征有好,中,差变成one-hot就是100,010,001)。并且,这些特征互斥,每次只有⼀个激活。因此,数据会变成稀疏的。这样做的好处主要有:1.解决了分类器不好处理属性数据的问题2.在⼀定程度上也起到了扩充特征的作⽤可以通过df.value_counts().plot.bar来绘制数值分布情况defplot_discrete_bar(data):cnt=data.value_counts()p1=plt.bar(cnt.index,height=list(cnt),width=0.8)forx,yinzip(cnt.index,list(cnt)):plt.text(x+0.05,y+0.05,'%.2f'%y,ha='center',va='bottom')clo_list=['bodyType','fuelType','gearbox','notRepairedDamage']i=1fig=plt.figure(figsize=(8,8))forcolinclo_list:plt.subplot(2,2,i)plot_discrete_bar(concat_data[col])i=i+1image.png对类别较少的特征采⽤one-hot编码,编码后特征由31个变为50个。one_hot_list=['gearbox','notRepairedDamage','bodyType','fuelType']forcolinone_hot_list:one_hot=pd.get_dummies(concat_data[col])one_hot.columns=[col+'_'+str(i)foriinrange(len(one_hot.columns))]concat_data=pd.concat([concat_data,one_hot],axis=1)这⾥发现seller和offerType虽然应该是⼆分类的取值,但是分布情况都偏向于⼀种取值结果,可以直接删掉concat_data['seller'].value_counts()image.pngconcat_data['offerType'].value_counts()image.pngconcat_data.drop(['offerType','seller'],axis=1,inplace=True)对于匿名变量来说,希望能更多的使⽤到这⾥的数值信息,通过选取若⼲个⾮匿名变量和匿名变量进⾏加法和乘法的数值操作,扩展数据的特征foriin['v_'+str(t)fortinrange(14)]:forjin['v_'+str(k)forkinrange(int(i[2:])+1,15)]:concat_data[str(i)+'+'+str(j)]=concat_data[str(i)]+concat_data[str(j)]foriin['model','brand','bodyType','fuelType','gearbox','power','kilometer','notRepairedDamage','regionCode']:forjin['v_'+str(i)foriinrange(14)]:concat_data[str(i)+'*'+str(j)]=concat_data[i]*concat_data[j]concat_data.shapeimage.png对⽇期数据处理⽇期数据同样是很重要的数据,有着具体的实际含义。这⾥我们先提取出⽇期中的年⽉⽇,再具体分析每个⽇期的数据。#设置⽇期的格式,例如20160404,设为2016-04-04,其中⽉份从1-12defdate_proc(x):m=int(x[4:6])ifm==0:m=1returnx[:4]+'-'+str(m)+'-'+x[6:]#定义⽇期提取函数defdate_transform(df,fea_col):forfintqdm(fea_col):df[f]=pd.to_datetime(df[f].astype('str').apply(date_proc))df[f+'_year']=df[f].dt.yeardf[f+'_month']=df[f].dt.monthdf[f+'_day']=df[f].dt.daydf[f+'_dayofweek']=df[f].dt.dayofweekreturn(df)#提取⽇期信息date_cols=['regDate','creatDate']concat_data=date_transform(concat_data,date_cols)image.png继续使⽤⽇期的数据,构造其他特征。分析var=data['creatDate']-data['regDate']的含义,var代表了车辆注册⽇期和创建交易的⽇期之间相差的天数,可以从侧⾯反映出汽车使⽤的时长,⼀般来说价格与使⽤时间成反⽐不过要注意,数据⾥有时间出错的格式,所以我们需要errors='coerce'data=concat_data.copy()#统计使⽤天数data['used_time1']=(pd.to_datetime(data['creatDate'],format='%Y%m%d',errors='coerce')-pd.to_datetime(data['regDate'],format='%Y%m%d',errors='coerce')).dt.daysdata['used_time2']=(pd.datetime.now()-pd.to_datetime(data['regDate'],format='%Y%m%d',errors='coerce')).dt.daysdata['used_time3']=(pd.datetime.now()-pd.to_datetime(data['creatDate'],format='%Y%m%d',errors='coerce')).dt.days#分桶操作,划分到区间内defcut_group(df,cols,num_bins=50):forcolincols:all_range=int(df[col].max()-df[col].min())#print(all_range)bin=[i*all_range/num_binsforiinrange(all_range)]df[col+'_bin']=pd.cut(df[col],bin,labels=False)#使⽤cut⽅法进⾏分箱returndf#分桶操作cut_cols=['used_time1','used_time2','used_time3']data=cut_group(data,cut_cols,50)#分桶操作data=cut_group(data,['kilometer'],10)对年份和⽉份进⾏处理,继续使⽤独热编码data['creatDate_year'].value_counts()image.pngdata['creatDate_month'].value_counts()#data['regDate_year'].value_counts()image.png#对类别较少的特征采⽤one-hot编码one_hot_list=['creatDate_year','creatDate_month','regDate_month','regDate_year']forcolinone_hot_list:one_hot=pd.get_dummies(data[col])one_hot.columns=[col+'_'+str(i)foriinrange(len(one_hot.columns))]data=pd.concat([data,one_hot],axis=1)#删除⽆⽤的SaleIDdata.drop(['SaleID'],axis=1,inplace=True)增加特征数量增加特征的数量可以从数理统计的⾓度出发,通过选取⼀些变量的数理特性来增加数据维度#count编码defcount_coding(df,fea_col):forfinfea_col:df[f+'_count']=df[f].map(df[f].value_counts())return(df)#count编码count_list=['model','brand','regionCode','bodyType','fuelType','name','regDate_year','regDate_month','regDate_day','regDate_dayofweek','creatDate_month','creatDate_day','creatDate_dayofweek','kilometer']data=count_coding(data,count_list)绘制热⼒图来分析匿名变量和price的相关性,其中v_0,v_8,v_12相关性较⾼temp=Train_data[['v_0','v_1','v_2','v_3','v_4','v_5','v_6','v_7','v_8','v_9','v_10','v_11','v_12','v_13','v_14','price']]#Zoomedheatmap,correlationmatrixsns.set(rc={'figure.figsize':(8,6)})correlation_matrix=temp.corr()k=8#numberofvariablesforheatmapcols=correlation_matrix.nlargest(k,'price')['price'].indexcm=np.corrcoef(temp[cols].values.T)sns.set(font_scale=1.25)hm=sns.heatmap(cm,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)plt.show()image.png#定义交叉特征统计defcross_cat_num(df,num_col,cat_col):forf1intqdm(cat_col):#对类别特征遍历g=df.groupby(f1,as_index=False)forf2intqdm(num_col):#对数值特征遍历feat=g[f2].agg({'{}_{}_max'.format(f1,f2):'max','{}_{}_min'.format(f1,f2):'min','{}_{}_median'.format(f1,f2):'median',})df=df.merge(feat,on=f1,how='left')return(df)#⽤数值特征对类别特征做统计刻画,挑了⼏个跟price相关性最⾼的匿名特征cross_cat=['model','brand','regDate_year']cross_num=['v_0','v_3','v_4','v_8','v_12','power']data=cross_cat_num(data,cross_num,cross_cat)#⼀阶交叉image.png划分数据集##选择特征列numerical_cols=data.columnsfeature_cols=[colforcolinnumerical_colsifcolnotin['price']]##提前特征列,标签列构造训练样本和测试样本X_data=data.iloc[:len(Train_data),:][feature_cols]Y_data=Train_data['price']X_test=data.iloc[len(Train_data):,:][feature_cols]print("X_data:",X_data.shape)print("X_test:",X_test.shape)image.png平均数编码:针对⾼基数定性特征(类别特征)的数据预处理定性特征的基数(cardinality)指的是这个定性特征所有可能的不同值的数量。在⾼基数(highcardinality)的定性特征⾯前,这些数据预处理的⽅法往往得不到令⼈满意的结果。⾼基数定性特征的例⼦:IP地址、电⼦邮件域名、城市名、家庭住址、街道、产品号码。主要原因:LabelEncoder编码⾼基数定性特征,虽然只需要⼀列,但是每个⾃然数都具有不同的重要意义,对于y⽽⾔线性不可分。使⽤简单模型,容易⽋拟合(underfit),⽆法完全捕获不同类别之间的区别;使⽤复杂模型,容易在其他地⽅过拟合(overfit)。OneHotEncoder编码⾼基数定性特征,必然产⽣上万列的稀疏矩阵,易消耗⼤量内存和训练时间,除⾮算法本⾝有相关优化(例:SVM)。importnumpyasnpimportpandasaspdfromsklearn.model_selectionimportStratifiedKFold,KFoldfromitertoolsimportproductclassMeanEncoder:def__init__(self,categorical_features,n_splits=10,target_type='classification',prior_weight_func=None):""":paramcategorical_features:listofstr,thenameofthecategoricalcolumnstoencode:paramn_splits:thenumberofsplitsusedinmeanencoding:paramtarget_type:str,'regression'or'classification':paramprior_weight_func:afunctionthattakesinthenumberofobservations,andoutputspriorweightwhenadictispassed,thedefaultexponentialdecayfunctionwillbeused:k:thenumberofobservationsneededfortheposteriortobeweightedequallyasthepriorf:largerf-->smallerslope"""self.categorical_features=categorical_featuresself.n_splits=n_splitsself.learned_stats={}iftarget_type=='classification':self.target_type=target_typeself.target_type=target_typeself.target_values=[]else:self.target_type='regression'self.target_values=Noneifisinstance(prior_weight_func,dict):self.prior_weight_func=eval('lambdax:1/(1+np.exp((x-k)/f))',dict(prior_weight_func,np=np))elifcallable(prior_weight_func):self.prior_weight_func=prior_weight_funcelse:self.prior_weight_func=lambdax:1/(1+np.exp((x-2)/1))@staticmethoddefmean_encode_subroutine(X_train,y_train,X_test,variable,target,prior_weight_func):X_train=X_train[[variable]].copy()X_test=X_test[[variable]].copy()iftargetisnotNone:nf_name='{}_pred_{}'.format(variable,target)X_train['pred_temp']=(y_train==target).astype(int)#classificationelse:nf_name='{}_pred'.format(variable)X_train['pred_temp']=y_train#regressionprior=X_train['pred_temp'].mean()col_avg_y=X_train.groupby(by=variable,axis=0)['pred_temp'].agg({'mean':'mean','beta':'size'})col_avg_y['beta']=prior_weight_func(col_avg_y['beta'])col_avg_y[nf_name]=col_avg_y['beta']*prior+(1-col_avg_y['beta'])*col_avg_y['mean']col_avg_y.drop(['beta','mean'],axis=1,inplace=True)nf_train=X_train.join(col_avg_y,on=variable)[nf_name].valuesnf_test=X_test.join(col_avg_y,on=variable).fillna(prior,inplace=False)[nf_name].valuesreturnnf_train,nf_test,prior,col_avg_ydeffit_transform(self,X,y):""":paramX:pandasDataFrame,n_samples*n_features:paramy:pandasSeriesornumpyarray,n_samples:returnX_new:thetransformedpandasDataFramecontainingmean-encodedcategoricalfeatures"""X_new=X.copy()ifself.target_type=='classification':skf=StratifiedKFold(self.n_splits)else:skf=KFold(self.n_splits)ifself.target_type=='classification':self.target_values=sorted(set(y))self.learned_stats={'{}_pred_{}'.format(variable,target):[]forvariable,targetinproduct(self.categorical_features,self.target_values)}forvariable,targetinproduct(self.categorical_features,self.target_values):nf_name='{}_pred_{}'.format(variable,target)X_new.loc[:,nf_name]=np.nanforlarge_ind,small_indinskf.split(y,y):nf_large,nf_small,prior,col_avg_y=MeanEncoder.mean_encode_subroutine(X_new.iloc[large_ind],y.iloc[large_ind],X_new.iloc[small_ind],variable,target,self.prior_weight_func)X_new.iloc[small_ind,-1]=nf_smallself.learned_stats[nf_name].append((prior,col_avg_y))else:self.learned_stats={'{}_pred'.format(variable):[]forvariableinself.categorical_features}forvariableinself.categorical_features:nf_name='{}_pred'.format(variable)X_new.loc[:,nf_name]=np.nanforlarge_ind,small_indinskf.split(y,y):nf_large,nf_small,prior,col_avg_y=MeanEncoder.mean_encode_subroutine(X_new.iloc[large_ind],y.iloc[large_ind],X_new.iloc[small_ind],variable,None,self.prior_weight_func)X_new.iloc[small_ind,-1]=nf_smallself.learned_stats[nf_name].append((prior,col_avg_y))returnX_newdeftransform(self,X):"""""":paramX:pandasDataFrame,n_samples*n_features:returnX_new:thetransformedpandasDataFramecontainingmean-encodedcategoricalfeatures"""X_new=X.copy()ifself.target_type=='classification':forvariable,targetinproduct(self.categorical_features,self.target_values):nf_name='{}_pred_{}'.format(variable,target)X_new[nf_name]=0forprior,col_avg_yinself.learned_stats[nf_name]:X_new[nf_name]+=X_new[[variable]].join(col_avg_y,on=variable).fillna(prior,inplace=False)[nf_name]X_new[nf_name]/=self.n_splitselse:forvariableinself.categorical_features:nf_name='{}_pred'.format(variable)X_new[nf_name]=0forprior,col_avg_yinself.learned_stats[nf_name]:X_new[nf_name]+=X_new[[variable]].join(col_avg_y,on=variable).fillna(prior,inplace=False)[nf_name]X_new[nf_name]/=self.n_splitsreturnX_new#⾼基数定性特征:name汽车交易名称,brand汽车品牌,regionCode地区编码class_list=['model','brand','name','regionCode']+date_cols#date_cols=['regDate','creatDate']MeanEnocodeFeature=class_list#声明需要平均数编码的特征ME=MeanEncoder(MeanEnocodeFeature,target_type='regression')#声明平均数编码的类X_data=ME.fit_transform(X_data,Y_data)#对训练数据集的X和y进⾏拟合X_test=ME.transform(X_test)#对测试集进⾏编码X_data['price']=Train_data['price']fromsklearn.model_selectionimportKFold#targetencoding⽬标编码,回归场景相对来说做⽬标编码的选择更多,不仅可以做均值编码,还可以做标准差编码、中位数编码等enc_cols=[]stats_default_dict={'max':X_data['price'].max(),'min':X_data['price'].min(),'median':X_data['price'].median(),'mean':X_data['price'].mean(),'sum':X_data['price'].sum(),'std':X_data['price'].std(),'skew':X_data['price'].skew(),'kurt':X_data['price'].kurt(),'mad':X_data['price'].mad()}###暂且选择这三种编码enc_stats=['max','min','mean']skf=KFold(n_splits=10,shuffle=True,random_state=42)forfintqdm(['regionCode','brand','regDate_year','creatDate_year','kilometer','model']):enc_dict={}forstatinenc_stats:enc_dict['{}_target_{}'.format(f,stat)]=statX_data['{}_target_{}'.format(f,stat)]=0X_test['{}_target_{}'.format(f,stat)]=0enc_cols.append('{}_target_{}'.format(f,stat))fori,(trn_idx,val_idx)inenumerate(skf.split(X_data,Y_data)):trn_x,val_x=X_data.iloc[trn_idx].reset_index(drop=True),X_data.iloc[val_idx].reset_index(drop=True)enc_df=trn_x.groupby(f,as_index=False)['price'].agg(enc_dict)val_x=val_x[[f]].merge(enc_df,on=f,how='left')test_x=X_test[[f]].merge(enc_df,on=f,how='left')forstatinenc_stats:val_x['{}_target_{}'.format(f,stat)]=val_x['{}_target_{}'.format(f,stat)].fillna(stats_default_dict[stat])test_x['{}_target_{}'.format(f,stat)]=test_x['{}_target_{}'.format(f,stat)].fillna(stats_default_dict[stat])X_data.loc[val_idx,'{}_target_{}'.format(f,stat)]=val_x['{}_target_{}'.format(f,stat)].valuesX_test['{}_target_{}'.format(f,stat)]+=test_x['{}_target_{}'.format(f,stat)].values/skf.n_splitsimage.pngdrop_list=['regDate','creatDate','brand_power_min','regDate_year_power_min']x_train=X_data.drop(drop_list+['price'],axis=1)x_test=X_test.drop(drop_list,axis=1)x_train.shapeimage.pngx_train=x_train.astype('float32')x_test=x_test.astype('float32')使⽤MinMaxScaler处理数据,再使⽤PCA降低维度fromsklearn.preprocessingimportMinMaxScaler#特征归⼀化min_max_scaler=MinMaxScaler()min_max_scaler.fit(pd.concat([x_train,x_test]).values)all_data=min_max_scaler.transform(pd.concat([x_train,x_test]).values)print(all_data.shape)fromsklearnimportdecompositionpca=decomposition.PCA(n_components=400)all_pca=pca.fit_transform(all_data)X_pca=all_pca[:len(x_train)]test=all_pca[len(x_train):]y=Train_data['price'].valuesprint(all_pca.shape)image.png模型选择这⾥以keras搭建基础的神经⽹络模型,模型结构选取全连接神经⽹络。image.pngfromkeras.layersimportConv1D,Activation,MaxPool1D,Flatten,Densefromkeras.layersimportInput,Dense,Concatenate,Reshape,Dropout,merge,AdddefNN_model(input_dim):init=keras.initializers.glorot_uniform(seed=1)model=keras.models.Sequential()model.add(Dense(units=300,input_dim=input_dim,kernel_initializer=init,activation='softplus'))#model.add(Dropout(0.2))model.add(Dense(units=300,kernel_initializer=init,activation='softplus'))#model.add(Dropout(0.2))model.add(Dense(units=64,kernel_initializer=init,activation='softplus'))model.add(Dense(units=32,kernel_initializer=init,activation='softplus'))model.add(Dense(units=8,kernel_initializer=init,activation='softplus'))model.add(Dense(units=1))returnmodelfromkeras.callbacksimportCallback,EarlyStoppingclassMetric(Callback):def__init__(self,model,callbacks,data):super().__init__()self.model=modelself.callbacks=callbacksself.data=datadefon_train_begin(self,logs=None):forcallbackinself.callbacks:callback.on_train_begin(logs)defon_train_end(self,logs=None):forcallbackinself.callbacks:callback.on_train_end(logs)defon_epoch_end(self,batch,logs=None):X_train,y_train=self.data[0][0],self.data[0][1]y_pred3=self.model.predict(X_train)y_pred=np.zeros((len(y_pred3),))y_true=np.zeros((len(y_pred3),))foriinrange(len(y_pred3)):y_pred[i]=y_pred3[i]foriinrange(len(y_p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论