python模型预测-用Python如何进行预测型数据分析_第1页
python模型预测-用Python如何进行预测型数据分析_第2页
python模型预测-用Python如何进行预测型数据分析_第3页
python模型预测-用Python如何进行预测型数据分析_第4页
python模型预测-用Python如何进行预测型数据分析_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

python模型预测_⽤Python如何进⾏预测型数据分析数据分析⼀般分为探索性数据分析、验证型数据分析和预测型数据分析。上⼀篇讲了如何⽤Python实现验证型数据分析(假设检验),⽂章链接:转变:⽤Python如何实现“假设检验”本⽂对Python进⾏预测型数据分析⽤到的基本机器学习算法和流程进⾏了简要总结。预测型数据分析⽤到的基本机器学习算法思维导图:本⽂采⽤鸢尾花数据集进⾏预测型数据分析算法实践导⼊鸢尾花数据集importpandasaspdiris=pd.read_csv('iris.csv')iris.sample(5)importseabornassns%matplotlibinlinesns.regplot(x='petal_length',y='petal_width',data=iris)#花瓣长度、花瓣宽度线性回归拟合图1.线性回归⽬标变量y是⼀个数值连续型变量单个特征构造模型#scikit-learn常⽤机器学习库简写sklearn#利⽤花瓣长度预测花瓣宽度fromsklearnimportlinear_modellm=linear_model.LinearRegression()features=['petal_length']X=iris[features]y=iris['petal_width']print(X.shape,y.shape)model=lm.fit(X,y)print(ercept_,model.coef_)#y=-0.36+0.416*x(150,1)(150,)-0.36651404521672704[0.41641913]model.predict(4)array([1.29916248])交叉检验评估模型fromsklearn.model_selectionimportcross_val_score#线性回归打分函数(分数越⾼,性能越好)#neg_mean_absolute_error是y-y'的绝对值和的平均#neg_mean_squared_error是(y-y')平⽅和的平均#cv=5表⽰5次交叉检验(常⽤5次)#误差函数越⼤,模型越不好,所以Python⾃动在前⾯加-号,越⼤表⽰误差越⼩,模型越好scores=-cross_val_score(lm,X,y,cv=5,scoring='neg_mean_absolute_error')print(scores)#得到5次交叉检验的绝对值误差[0.085818170.095338210.137921540.20740440.29904645]#⼀般⽤5次的平均值作为衡量模型好坏的指标importnumpyasnpprint(np.mean(scores))0.1651057510041143scores=-cross_val_score(lm,X,y,cv=5,scoring='neg_mean_squared_error')print(np.mean(scores))0.04548097902618274多个特征构造模型#两个特征构造模型features=['petal_length','sepal_length']X=iris[features]y=iris['petal_width']#print(X.shape,y.shape)model=lm.fit(X,y)print(ercept_,model.coef_)-0.013852011013002707[0.44992999-0.08190841]#评估模型scores=-cross_val_score(lm,X,y,cv=5,scoring='neg_mean_squared_error')

print(np.mean(scores))0.0460189525758428加⼊花萼长度特征预测花瓣宽度,误差为0.0460,⽐单独⽤花瓣长度预测花瓣宽度得到模型的误差0.0454还⼤说明没有单独⽤花瓣长度预测花瓣宽度更合适#三个特征构造模型并评估模型features=['petal_length','sepal_length','sepal_width']X=iris[features]y=iris['petal_width']model=lm.fit(X,y)scores=-cross_val_score(lm,X,y,cv=5,scoring='neg_mean_squared_error')print(np.mean(scores))0.03950366038609736加⼊花萼长度、花萼宽度⽤三个特征⼀起预测花瓣宽度,误差为0.039,⼜⽐单独⽤花瓣长度预测花瓣宽度更合适。利⽤建⽴的模型预测#⼀组变量预测(变量参数必须横向传⼊,单组变量默认列存储,所以需要转置)list=[4,3,2]pred_x=pd.DataFrame(list).Tprint(pred_x)pred_y=lm.predict(pred_x)print(pred_y)print(type(pred_y))0120432[1.68236958]#多组变量预测list2=[[4,3,2],[3,1,5]]pred_x=pd.DataFrame(list2,columns=['x1','x2','x3'])print(pred_x)pred_y=pd.DataFrame(lm.predict(pred_x),columns=['y'])print(pred_y)print(type(pred_y))x1x2x304321315

y01.68237012.263156#合并输⼊特征和⽬标变量预测结果result=pd.concat([pred_x,pred_y],axis=1)print(result)x1x2x3y04321.68237013152.2631562.分类⽬标变量y是⼀个类别离散型变量分类经典⽅法:逻辑回归#scikit-learn逻辑回归fromsklearnimportlinear_modelfromsklearn.model_selectionimportcross_val_scorefromsklearn.preprocessingimportLabelEncoder将类别⽬标变量species由字符串类型转换为数值类型#第⼀种⽅法,采⽤LabelEncoder函数le=LabelEncoder()#初始化类实例le.fit(iris['species'])#遍历⼀遍属性y=le.transform(iris['species'])#类别转换成⾮字符串print(y)print(type(y))[000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222]#第⼆种⽅法,采⽤DataFrame的map函数,利⽤字典映射species_dict={'setosa':0,'versicolor':1,'virginica':2}

y1=iris.species.map(species_dict)print(y1.sample(10))521511410201207912101701062200Name:species,dtype:int64#构造模型model_log=linear_model.LogisticRegression()features=['petal_length']X=iris[features]model_log.fit(X,y)LogisticRegression(C=1.0,class_weight=None,dual=False,fit_intercept=True,intercept_scaling=1,max_iter=100,multi_class='ovr',n_jobs=1,penalty='l2',random_state=None,solver='liblinear',tol=0.0001,verbose=0,warm_start=False)#评估模型features=['petal_length']X=iris[features]scores=cross_val_score(model_log,X,y,cv=5,scoring='accuracy')#accuracy表⽰属于某个类别的准确率#scores=cross_val_score(model_log,X,y1,cv=5,scoring='accuracy')#⽤y或者y1得到评分⼀样print(np.mean(scores))0.7866666666666667#增加特征,查看评分features=['petal_length','petal_width']X=iris[features]#X1=iris[['petal_length','petal_width']]#X和X1结果相同scores=cross_val_score(model_log,X,y,cv=5,scoring='accuracy')

print(np.mean(scores))0.8666666666666668#3个特征features=['petal_length','petal_width','sepal_length','sepal_width']X=iris[features]scores=cross_val_score(model_log,X,y,cv=5,scoring='accuracy')print(np.mean(scores))0.9600000000000002属性(特征)参与越多类别识别概率越⾼3.k近邻(分类和回归都可以⽤)fromsklearnimportneighbors3.1k近邻分类features=['petal_length','petal_width']X=iris[features]le=LabelEncoder()le.fit(iris['species'])y=le.transform(iris['species'])knn=neighbors.KNeighborsClassifier(5,weights='uniform')knn.fit(X,y)scores=cross_val_score(knn,X,y,cv=5,scoring='accuracy')print(np.mean(scores))0.96666666666666683.2k近邻回归features=['petal_length','sepal_length','sepal_width']X=iris[features]y=iris['petal_width']knn=neighbors.KNeighborsRegressor(5,weights='uniform')knn.fit(X,y)scores=-cross_val_score(knn,X,y,cv=5,scoring='neg_mean_squared_error')print(np.mean(scores))0.04143999999999999通过参数调整,可以在交叉检验评分上获得更好的结果;那么是不是真的到预测的时候会更好呢也是说不准;但⾄少通过参数的调整尽量保证有更⼤的概率,在未来真正的测试样例上能得到准确的结果。4.决策树(分类和回归都可以⽤)

4.1决策树分类fromsklearnimporttreefeatures=['petal_length','petal_width']X=iris[features]le=LabelEncoder()le.fit(iris['species'])y=le.transform(iris['species'])dt=tree.DecisionTreeClassifier()dt.fit(X,y)scores=cross_val_score(dt,X,y,cv=5,scoring='accuracy')print(np.mean(scores))0.95333333333333344.2决策树回归features=['petal_length','sepal_length','sepal_width']X=iris[features]y=iris['petal_width']dt=tree.DecisionTreeRegressor()dt.fit(X,y)scores=-cross_val_score(dt,X,y,cv=5,scoring='neg_mean_squared_error')print(np.mean(scores))0.066449999999999985.随机森林(分类和回归都可以⽤)5.1随机森林分类fromsklearnimportensemblefeatures=['petal_length','petal_width']X=iris[features]le=LabelEncoder()le.fit(iris['species'])y=le.transform(iris['species'])rf=ensemble.RandomForestClassifier(10)rf.fit(X,y)scores=cross_val_score(rf,X,y,cv=5,scoring='accuracy')print(np.mean(scores))0.9666666666666666

5.2随机森林回归features=['petal_length','sepal_length','sepal_width']X=iris[features]y=iris['petal_width']rf=ensemble.RandomForestRegressor(10)rf.fit(X,y)scores=-cross_val_score(rf,X,y,cv=5,scoring='neg_mean_squared_error')print(np.mean(scores))0.042581507592592605随机森林的计算时间和决策树(基分类器)的数量成正⽐,但是基分类器的数量和结果准确率却不⼀定成正⽐;随机森林⼀般能得到:⼀个可能要挑到的特别合适的单个模型的结果差不多能达到的那个程度;如果挑到的单个模型不合适这个数据集,就会⽐随机森林差很多,所以随机森林可以作为⼀开始尝试数据集,查看⾄少可以达到怎样的分析结果和预测性能,如果挑的单个模型⽐随机森林还差,就需要好好分析下,看看能不能找到更合适的⼀些模型。6.聚类属于⾮监督学习,不是预测⽬标变量(聚类问题只有X,没有y);⽽是在样本中寻找⾃然集群,⽐如顾客细分、⽂章聚类等分类:事先已知存在哪些类别聚类:事先不知存在哪些类别尝试利⽤鸢尾花花瓣、花萼长度、宽度特征对其进⾏聚类#先根据花瓣长度、花瓣宽度,画出实际的鸢尾花类别图importseabornassnsimportmatplotlib.pyplotasplt%matplotlibinlineg=sns.FacetGrid(iris,hue='species')g.map(plt.scatter,'petal_width','petal_length').add_legend()从图可以看出,橙黄⾊和绿⾊边界上的点利⽤聚类⽅法可能不是很好找;下⾯利⽤聚类⽅法进⾏分类,看看预测的类别和实际类别差别。6.1K均值聚类算法fromsklearn.clusterimportKMeansfeatures=['petal_length','petal_width']X=iris[features]⾸先设置K值为2,假定是两类km=KMeans(2)#建⽴模型km.fit(X)#训练特征获得模型iris['cluster_k2']=km.predict(X)#利⽤模型对特征向量进⾏预测g=sns.FacetGrid(iris,hue='cluster_k2')g.map(plt.scatter,'petal_width','petal_length').add_legend()

可以看出通过KMeans⽅法,K值为2找出了两类,但是类别1中有⼀个点还是计算错了;由于KMeans算法具有随机性,再运⾏⼀次0、1标签可能有变化。设置K值为3,假定是三类km=KMeans(3)#建⽴模型km.fit(X)#训练特征iris['cluster_k3']=km.predict(X)#利⽤predict()⽅法获取fit训练那部分点的⽤KMeans算法分完类的结果g=sns.FacetGrid(iris,hue='cluster_k3')g.map(plt.scatter,'petal_width','petal_length').add_legend()可以看出,设定K=3,0类别很好找出来了,但是1和2类别边界的有些点还是没有很好区分出来。说明即使不知道鸢尾花真实类别情况下,我们有可能得到准确结果,预测鸢尾花类别。K-Means算法针对“质⼼”去计算⼀个距离,最后结果是同类别的点都在⼀个圆形或者球形范围内;但是并不是所有的类别表现形式都是球形或者圆形,对这样类别K-Means算法表现就⽐较差,我们可以⽤DBSCAN算法。6.2DBSCAN聚类算法#⽣成数据点fromsklearnimportdatasetsfrompandasimportDataFramenoisy_circles=datasets.make_circles(n_samples=1000,factor=.5,noise=.05)df=DataFrame()df['x1']=noisy_circles[0][:,0]df['x2']=noisy_circles[0][:,1]df['label']=noisy_circles[1]df.sample(5)#画出实际类别图g=sns.FacetGrid(df,hue='label')g.map(plt.scatter,'x1','x2').add_legend()#K-Means算法聚类fromsklearn.clusterimportKMeanskm=KMeans(2)X=df[['x1','x2']]km.fit(X)df['label_KMeans']=km.predict(X)g=sns.FacetGrid(df,hue='label_KMeans')g.map(plt.scatter,'x1','x2').add_legend()可见KMeans算法对这问题效类果很差。#DBSCAN算法聚类

fromsklearn.clusterimportDBSCANkm=DBSCAN(eps=0.1,min_samples=10)#eps=0.1X=df[['x1','x2']]km.fit(X)df['label_DBSCAN']=km.labels_#DBSCAN算法⽤‘labels_’⽅法(KMeans算法⽤predict()⽅法

温馨提示

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

评论

0/150

提交评论