From c7526068405ecefdbbdc2ae97b132a9a5ef19c8a Mon Sep 17 00:00:00 2001 From: "wenwen.tang@thizgroup.com" <wenwen.tang@thizgroup.com> Date: Fri, 26 Apr 2024 14:17:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=84=E6=B5=8B=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E5=A2=9E=E5=8A=A08=E6=A1=A3=E9=A2=84?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ai/EstimateMarketTrendV20.py | 22 +++++++++++++--------- ai/model_trainer.py | 22 ++++++++++++++++++++-- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/ai/EstimateMarketTrendV20.py b/ai/EstimateMarketTrendV20.py index 0c4a5ae..0d1f087 100644 --- a/ai/EstimateMarketTrendV20.py +++ b/ai/EstimateMarketTrendV20.py @@ -11,24 +11,23 @@ from ai.training_data_builder import TrainingDataBuilder from api import DataSync # æˆªæ¢æ—¥æœŸ -# max_date = None -max_date = '2024-03-01' +max_date = None +# max_date = '2024-03-20' # max_date = '2024-01-11' toForecast = True # False means test, True means forecast syncData = True # å¼€å¯ä¼šåŒæ¥æ•°æ®åº“指数åŠåŸºé‡‘æ•°æ® -uploadData = False # å¼€å¯ä¼šä¸Šä¼ 预测结果 +uploadData = True # å¼€å¯ä¼šä¸Šä¼ 预测结果 doReport = True # å¼€å¯ä¼šç”ŸæˆExcel报告 # 待预测指数 # PREDICT_LIST = [67, 121, 122, 123] -PREDICT_LIST = [67, 121, 122, 123, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, - 174, 175, 177, 178] +PREDICT_LIST = [67, 121, 122, 123, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 174, 175, 177, 178] eco = [65, 66, 74, 134] index = [67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 105, 106, 116, 117, 138, 139, 142, 143, 140, 141, 144, 145, 146] -fund = [121, 122, 123, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 174, 175, - 177, - 178] +fund = [121, 122, 123, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 174, 175, 177, 178] @autowired @@ -130,10 +129,15 @@ if __name__ == '__main__': rf_model = trainer.train_random_forest(X_train, y_train, X_test, y_test) gbt_model = trainer.train_GBT(X_train, y_train, X_test, y_test) svc_model = trainer.train_SVC(X_train, y_train, X_test, y_test) - ensemble_model = trainer.ensemble_model(rf_model, gbt_model, svc_model, X_train, y_train, X_test, y_test) + knn_model = trainer.train_nearest_neighbors(X_train, y_train, X_test, y_test) + ada_model = trainer.train_AdaBoost(X_train, y_train, X_test, y_test) + ensemble_model = trainer.ensemble_model(rf_model, gbt_model, svc_model, + knn_model, ada_model, X_train, y_train, X_test, y_test) model_predict = {'forest': rf_model.predict(scaledX_forecast), 'gbt': gbt_model.predict(scaledX_forecast), 'svc': svc_model.predict(scaledX_forecast), + 'knn': knn_model.predict(scaledX_forecast), + 'adaboost': ada_model.predict(scaledX_forecast), 'ensemble': ensemble_model.predict(scaledX_forecast)} print(f'预测结果:{model_predict}'.center(60, '+')) judgement(pid, infos_type[pid], model_predict) diff --git a/ai/model_trainer.py b/ai/model_trainer.py index 662fa01..939be9c 100644 --- a/ai/model_trainer.py +++ b/ai/model_trainer.py @@ -3,8 +3,10 @@ from abc import ABC import matplotlib.pyplot as plt from lightgbm import LGBMClassifier from sklearn import svm +from sklearn.ensemble import AdaBoostClassifier from sklearn.ensemble import RandomForestClassifier, VotingClassifier from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay, accuracy_score +from sklearn.neighbors import KNeighborsClassifier class ModelTrainer(ABC): @@ -61,9 +63,25 @@ class ModelTrainer(ABC): self.test_model('Support Vector Machines', classifierSVC, X_test, y_test) return classifierSVC - def ensemble_model(self, rf_model, gbt_model, svc_model, X_train, y_train, X_test, y_test): + def train_nearest_neighbors(self, X_train, y_train, X_test, y_test): + classifier = KNeighborsClassifier() + classifier.fit(X_train, y_train) + if not self._toForecast: + self.test_model('K-Nearest Neighbors', classifier, X_test, y_test) + return classifier + + def train_AdaBoost(self, X_train, y_train, X_test, y_test): + classifier = AdaBoostClassifier() + classifier.fit(X_train, y_train) + if not self._toForecast: + self.test_model('AdaBoost', classifier, X_test, y_test) + return classifier + + def ensemble_model(self, rf_model, gbt_model, svc_model, knn_model, + ada_model, X_train, y_train, X_test, y_test): # Create a dictionary of our models - estimators = [('rf', rf_model), ('gbt', gbt_model), ('svc', svc_model)] + estimators = [('rf', rf_model), ('gbt', gbt_model), ('svc', svc_model), + ('knn', knn_model), ('AdaBoost', ada_model)] # Create our voting classifier, inputting our models ensemble = VotingClassifier(estimators, voting='hard') # fit model to training data -- 2.18.1