1 Star 0 Fork 0

jiahangOK / KCFCPP

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
regression_fit.py 7.08 KB
一键复制 编辑 原始数据 按行查看 历史
jiahangOK 提交于 2020-07-08 10:08 . test different regression model
'''
regression_fit.py
用于多元回归 拟合tracker的数据
参考:
1. https://blog.csdn.net/weixin_40014576/article/details/79918819
2. https://blog.csdn.net/Night_MFC/article/details/87710633
'''
import traceback
import pandas as pd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.model_selection import train_test_split
models = []
###########3.具体方法选择##########
####3.1决策树回归####
from sklearn import tree
model_DecisionTreeRegressor = tree.DecisionTreeRegressor()
models.append(('决策树回归',model_DecisionTreeRegressor))
####3.2线性回归####
from sklearn import linear_model
model_LinearRegression = linear_model.LinearRegression()
models.append(('线性回归',model_LinearRegression))
####3.3SVM回归####
from sklearn import svm
model_SVR = svm.SVR()
models.append(('SVM回归',model_SVR))
####3.4KNN回归####
from sklearn import neighbors
model_KNeighborsRegressor = neighbors.KNeighborsRegressor()
models.append(('KNN回归',model_KNeighborsRegressor))
####3.5随机森林回归####
from sklearn import ensemble
model_RandomForestRegressor = ensemble.RandomForestRegressor(n_estimators=20)#这里使用20个决策树
models.append(('随机森林回归', model_RandomForestRegressor))
####3.6Adaboost回归####
from sklearn import ensemble
model_AdaBoostRegressor = ensemble.AdaBoostRegressor(n_estimators=50)#这里使用50个决策树
models.append(('Adaboost回归', model_AdaBoostRegressor))
####3.7GBRT回归####
from sklearn import ensemble
model_GradientBoostingRegressor = ensemble.GradientBoostingRegressor(n_estimators=100)#这里使用100个决策树
models.append(('GBRT回归', model_GradientBoostingRegressor))
####3.8Bagging回归####
from sklearn.ensemble import BaggingRegressor
model_BaggingRegressor = BaggingRegressor()
models.append(('Bagging回归', model_BaggingRegressor))
####3.9ExtraTree极端随机树回归####
from sklearn.tree import ExtraTreeRegressor
model_ExtraTreeRegressor = ExtraTreeRegressor()
models.append(('ExtraTree极端随机树回归', model_ExtraTreeRegressor))
####3.10ARD贝叶斯ARD回归
model_ARDRegression = linear_model.ARDRegression()
models.append(('ARD贝叶斯ARD回归', model_ARDRegression))
####3.11BayesianRidge贝叶斯岭回归
model_BayesianRidge = linear_model.BayesianRidge()
models.append(('BayesianRidge贝叶斯岭回归', model_BayesianRidge))
####3.12TheilSen泰尔森估算
model_TheilSenRegressor = linear_model.TheilSenRegressor()
models.append(('TheilSen泰尔森估算', model_TheilSenRegressor))
####3.13RANSAC随机抽样一致性算法
model_RANSACRegressor = linear_model.RANSACRegressor()
models.append(('RANSAC随机抽样一致性算法', model_RANSACRegressor))
def get_diff(row):
return row['iou_with_track'] - row['iou_no_track']
def get_class(row):
if row['speed'] >= 0 and row['speed'] < 0.5:
if row['size'] >= 0 and row['size'] < 1500:
return '0'
elif row['size'] >= 1500 and row['size'] < 4000:
return '1'
else:
return '2'
elif row['speed'] >= 0.5 and row['speed'] < 1:
if row['size'] >= 0 and row['size'] < 1500:
return '3'
elif row['size'] >= 1500 and row['size'] < 4000:
return '4'
else:
return '5'
else:
if row['size'] >= 0 and row['size'] < 1500:
return '6'
elif row['size'] >= 1500 and row['size'] < 4000:
return '7'
else:
return '8'
def get_var_name(v):
(fn, ln, fn, text) = traceback.extract_stack()[-2]
begin = text.find('aaaprint(') + len('aaaprint(')
end = text.find(')', begin)
return '{}'.format(text[begin:end])
def test_regression(tracker_data, model_tuple, test_size):
model_name = model_tuple[0]
model = model_tuple[1]
# 划分测试数据和训练数据
X_train,X_test,Y_train,Y_test = train_test_split(tracker_data[['distance','speed','size']],tracker_data.iou_diff, test_size=test_size, random_state=0)
# print('='*50)
# print("原始数据特征:",tracker_data[['distance']].shape,
# ",训练数据特征:",X_train.shape,
# ",测试数据特征:",X_test.shape)
# print("原始数据标签:",tracker_data.iou_diff.shape,
# ",训练数据标签:",Y_train.shape,
# ",测试数据标签:",Y_test.shape)
# model = LinearRegression()
# model = tree.DecisionTreeRegressor()
# model = svm.SVR()
# model = neighbors.KNeighborsRegressor()
model.fit(X_train,Y_train)
# a = model.intercept_ # 截距
# b = model.coef_ # 回归系数
# print('='*50)
# print("最佳拟合线:截距",a,",回归系数:",b)
score = model.score(X_test,Y_test)
print('回归模型:{}\t拟合得分:{:04f}\t测试数据数量:{}'.format(model_name, score, Y_test.shape[0]))
# 对测试集进行线性回归预测
# Y_pred = model.predict(X_test)
# print(Y_pred)
# plt.plot(range(len(Y_pred)),Y_pred,'b',marker = 'o', label="predict")
# plt.plot(range(len(Y_pred)),Y_test,'r',marker = 'o', label="test")
# plt.title("score:{:.06f}".format(score))
# plt.xlabel('item')
# plt.ylabel('iou_diff')
# plt.legend()
# 显示图像
# plt.savefig("0-diff.jpg")
# plt.show()
if __name__ == "__main__":
# 通过read_csv来读取我们的数据集
tracker_data = pd.read_csv("tracker_data.csv")
# 增加iou_diff一列
tracker_data.insert(loc=0, column='iou_diff', value=tracker_data.apply(get_diff, axis='columns'))
# 增加class一列,speed取三个区间,size取三个区间,合起来有9种类别
tracker_data.insert(loc=0, column='class', value=tracker_data.apply(get_class, axis='columns'))
# 需要用到的数据
tracker_data = tracker_data[['iou_diff','iou_with_track', 'iou_no_track', 'distance', 'speed', 'size', 'class']]
# 根据不同类别筛选数据, 每一类取相同的数量
print("="*50)
print('每一类对应的数量:')
print(tracker_data['class'].value_counts())
# 每一类取3000个数据
classes = []
for i in range(9):
x = tracker_data[tracker_data['class'] == str(i)]
classes.append(x)
sample_classes = []
for i in range(9):
x = classes[i].sample(n=3000)
sample_classes.append(x)
# print(x.shape[0], ',', x.shape[1])
# 合并 DataFrame
tracker_data2 = pd.concat(sample_classes, ignore_index=True)
# print(tracker_data.shape[0], ',', tracker_data.shape[1])
# 得到我们所需要的数据集且查看其前几列以及数据形状
print("="*50)
print('得到所需要的数据集且查看其前几列以及数据形状')
print('head:', tracker_data.head(),'\nShape:', tracker_data.shape)
print(tracker_data.describe())
# 测试不同回归方法的效果
print("="*50)
print('不取样,test比例:0.3')
for model in models:
test_regression(tracker_data, model, 0.3)
print("="*50)
print('取样,9类 每类取2000,test比例:0.3')
for model in models:
test_regression(tracker_data2, model, 0.3)
1
https://gitee.com/jiahangok/KCFCPP.git
git@gitee.com:jiahangok/KCFCPP.git
jiahangok
KCFCPP
KCFCPP
master

搜索帮助