【Python】基于Python的机器学习回归:可视化、预测及预测结果保存(附代码)

您所在的位置:网站首页 回归分析python代码 【Python】基于Python的机器学习回归:可视化、预测及预测结果保存(附代码)

【Python】基于Python的机器学习回归:可视化、预测及预测结果保存(附代码)

2024-06-13 15:18| 来源: 网络整理| 查看: 265

目录 0 一个交互性的软件0 大无语事件1 简介2 数据3 代码4 效果5 关于数据获取

0 一个交互性的软件

基于相关需求,我使用python封装了一个交互性机器学习回归软件,现已依托单位,发布在国家地球系统科学数据中心:湖泊—流域分中心的平台上(这里),可以进行申请。 软件预览图如下: 在这里插入图片描述

0 大无语事件

写在前面。

就在我写这篇文章的时候,我是直接套用之前文章的模板(就是把之前文章拷贝然后再改),结果没想到,拷贝后整混了!!!然后等于我把之前的文章给改了。。我发布了才发现。。。然后之前随机森林的第二篇博客就这样被我改掉了。。。为了不丢人,我就给隐藏起来了

所以下面的有关随机森林的第二篇文章的链接进不去。。

然后最近又比较忙。。等稳定下来我把那篇给补一下。。

1 简介

其实……不太想写简介……

之前写了两篇(第一篇点这里;第二篇点这里)关于机器学习(随机森林)的文章,反响还不错。然后前一段时间有一些小伙伴来问我关于预测的事情,我仔细回想了一下之前的文章我似乎没有把预测当成一个重要的任务(我在一定程度上陷入了误区),所以我赶紧(拖了好几个月)写下了这篇博客。

机器学习不用多说了,主要还是用来完成回归和分类任务。本篇的任务是对于离散数据的回归,基于由训练集训练好的模型,然后根据预测集的feature对预测集的target预测(反正说白了就是回归,纯回归)。

2 数据

之前写的那篇文章很多同学都求数据……所以为了写这次的文章,我特地做了一个550个样本,10个特征的数据集。

我存为.xlsx格式,下面的代码可以直接读取。

这个数据集里,一行是一个样本,前10个为特征(x1~x10),最后一个是目标变量。

在下面的代码中,我将会把这个样本数据集分割成三份,分别是训练集、测试集、预测集。训练集的任务就是训练出回归模型,所以一般来说训练集的样本数会比较多;测试集的任务是测试这个模型到底靠不靠谱,一般来说会自带target,因为是测试,所以样本数会少一点;预测集的任务就是你的需求了,把你需要预测的feature输入数据集里(target输不输入无所谓)下面的代码就会跑出根据feature预测的结果。 在这里插入图片描述

3 代码

基本思想和我之前的两篇文章一样,我拿这之前两篇文章里的代码,花了一个多小时改了改。 基于python的回归随机森林(RandomForestRegression)1:生成折线图与散点图(附代码) 基于python的回归随机森林(RandomForestRegression)2:计算各特征指标的权重(IncMSE)(附代码)

import numpy as np import matplotlib.pyplot as plt import math import xlrd import xlsxwriter import random ###########1.读取数据部分########## #载入数据并且打乱数据集 def load_data(TrainStartPo, TrainEndPo, TestStartPo, TestEndPo, PredStartPo, PredEndPo, FeatureNum, FilePath): # 训练样本起始行数、结束行数,测试样本起始行数、结束行数,预测样本起始行数、结束行数,特征数,excel文件路径 # 打开excel文件 workbook = xlrd.open_workbook(str(FilePath)) # excel路径 sheet = workbook.sheet_by_name('Sheet1') # heet表 train = [] # 训练集 test = [] pred = [] # 预测集 # 载入训练样本集 for load_train in range(TrainStartPo-1, TrainEndPo): train.append(sheet.row_values(load_train)) # 载入测试样本集 for load_test in range(TestStartPo-1, TestEndPo): test.append(sheet.row_values(load_test)) # 载入预测样本集 for load_pred in range(PredStartPo-1, PredEndPo): pred.append(sheet.row_values(load_pred)) #变换样本集 TrainSet = np.array(train) TestSet = np.array(test) PredSet = np.array(pred) #分割特征与目标变量 x1 , y1 = TrainSet[:,:FeatureNum] , TrainSet[:,-1] x2 , y2 = TestSet[:,:FeatureNum] , TestSet[:,-1] x3 , y3 = PredSet[:,:FeatureNum] , PredSet[:,-1] return x1 , y1 , x2 , y2, x3, y3 ###########2.回归和显示部分########## def regression_method(model, x_train, y_train, x_test, y_test, x_pred): model.fit(x_train, y_train) # 使用训练集训练样本 score = model.score(x_test, y_test) result = model.predict(x_test) pred = model.predict(x_pred) #######计算模型参数####### ResidualSquare = (result - y_test)**2 #计算残差平方 MSE = np.mean(ResidualSquare) #计算均方差 RSS = sum(ResidualSquare) #计算残差平方和 # print(f'R^2={score}') # print(f'MSE={MSE}') # print(f'RSS={RSS}') ############绘图########### plt.figure(1, figsize=(16,8)) # 子图1 plt.subplot(121) plt.plot(np.arange(len(result)), y_test, 'go-', label='test value') plt.plot(np.arange(len(result)), result, 'ro-', label='predict value') plt.legend() # 将样例显示出来 # 子图2 plt.subplot(122) plt.plot(np.arange(len(pred)), pred, 'bo-', label='predict value') ################## plt.suptitle(f'R^2 = {score}\nMSE = {MSE}\nRSS = {RSS}') plt.show() return pred ##########3.写入预测值######## def write_predict(x_pred, pred, OutPut): workbook = xlsxwriter.Workbook(str(OutPut)) # 保存地址 worksheet = workbook.add_worksheet('Sheet1') for i in range(len(x_pred)): for j in range(len(x_pred[0])): worksheet.write(i , j, x_pred[i][j]) # 写入预测样本 worksheet.write(i, j+1, pred[i]) # 写入预测值 workbook.close() print('数据写入完成') ###########4.预设回归方法########## ####4.1决策树回归#### from sklearn import tree model_DecisionTreeRegressor = tree.DecisionTreeRegressor() ####4.2线性回归#### from sklearn import linear_model model_LinearRegression = linear_model.LinearRegression() ####4.3SVM回归#### from sklearn import svm model_SVR = svm.SVR() ####4.4KNN回归#### from sklearn import neighbors model_KNeighborsRegressor = neighbors.KNeighborsRegressor() ####4.5随机森林回归#### from sklearn import ensemble model_RandomForestRegressor = ensemble.RandomForestRegressor(n_estimators=20)#这里使用20个决策树 ####4.6Adaboost回归#### from sklearn import ensemble model_AdaBoostRegressor = ensemble.AdaBoostRegressor(n_estimators=50)#这里使用50个决策树 ####4.7GBRT回归#### from sklearn import ensemble model_GradientBoostingRegressor = ensemble.GradientBoostingRegressor(n_estimators=100)#这里使用100个决策树 ####4.8Bagging回归#### from sklearn.ensemble import BaggingRegressor model_BaggingRegressor = BaggingRegressor() ####4.9ExtraTree极端随机树回归#### from sklearn.tree import ExtraTreeRegressor model_ExtraTreeRegressor = ExtraTreeRegressor() ########5.设置参数与执行部分############# #设置数据参数部分 method = model_RandomForestRegressor # 选择方法 trains = [2, 501] # 训练集起始结束行 tests = [502, 531] # 测试集起始结束行 preds = [532, 551] # 预测集起始结束行 features = 10 # 特征数 path = r'\ML Data.xlsx' # 样本数据集读取路径 output = r'\ML Results.xlsx' # 预测数据集保存路径 x_train, y_train, x_test, y_test, x_pred, y_pred = load_data(trains[0], trains[1], tests[0], tests[1], preds[0], preds[1], features, path) #行数以excel里为准 pred = regression_method(method, x_train, y_train, x_test, y_test, x_pred) #括号内填上方法,并获取预测值 write_predict(x_pred, pred, output)

代码就不多解释了,都在注释里。在运行的时候把“5.设置参数与执行部分”里的那些什么method啊、trains啊、tests、preds啊什么的都填上,缺一不可奥。

我上面写的代码默认是用随机森林回归,把excel表里的2到501行数据(共500个样本)当作训练集、502到531行数据(共30个样本)当作测试集、532到551行数据(共20个样本)当作预测集,可以根据需要自己调整。

4 效果

根据上面的代码运行会出现一张图,然后在你output写的路径下保存一个xlsx文件。

首先我这里图长这样。 在这里插入图片描述 然后保存的结果。 在这里插入图片描述 上面图里显示R2有0.98+,所以我这里把我的预测集原来的target和随机森林预测的target拷贝到一个表里简单对比一下。 在这里插入图片描述 大家把效果拔群四个字打在公屏上!

5 关于数据获取

这篇文章用到的样本集数据获取本来是免费的,但是因为联系我的太多了(而且并没有人打赏),所以我打算有偿获取(收点费用意思一下,5元以上)。需要的小伙伴们可以联系我邮箱([email protected])并且贴上打赏付款证明(码在下面),我看到后就会发送数据。

另外我及不及时回复比较随缘了,我尽量一天看一次邮箱。

(我的乞讨码在下面)~ -----------------------分割线(以下是乞讨内容)----------------------- 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3