活动介绍

def train(): Dtr, Val, Dte = load_data() print('train...') epoch_num = 30 best_model = None min_epochs = 5 min_val_loss = 5 model = cnn().to(device) optimizer = optim.Adam(model.parameters(), lr=0.0008) criterion = nn.CrossEntropyLoss().to(device) # criterion = nn.BCELoss().to(device) for epoch in tqdm(range(epoch_num), ascii=True): train_loss = [] for batch_idx, (data, target) in enumerate(Dtr, 0): try: data, target = Variable(data).to(device), Variable(target.long()).to(device) # target = target.view(target.shape[0], -1) # print(target) optimizer.zero_grad() output = model(data) # print(output) loss = criterion(output, target) loss.backward() optimizer.step() train_loss.append(loss.cpu().item()) except: continue # validation val_loss = get_val_loss(model, Val) model.train() if epoch + 1 > min_epochs and val_loss < min_val_loss: min_val_loss = val_loss best_model = copy.deepcopy(model) torch.save(best_model.state_dict(), r"E:\dataset\Airbnb\training_data\model\cnn.pkl")

时间: 2024-01-13 09:05:00 浏览: 187
这段代码是一个简单的CNN模型的训练过程。它的输入是经过处理的数据集 Dtr, Val, Dte,其中 Dtr 是训练集,Val 是验证集,Dte 是测试集。模型的优化器采用 Adam 算法,损失函数采用交叉熵损失。 在每个 epoch 中,模型会对训练集 Dtr 进行迭代,计算损失并更新参数。同时,模型会在验证集 Val 上计算损失,如果当前的验证损失比之前最小的验证损失要小,则更新最小验证损失和最佳模型参数。当 epoch 数量达到最大值或者验证损失连续 min_epochs 次未下降时,训练过程会结束。 最后,最佳模型的参数会被保存到本地文件中。
相关问题

from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split x=wine_data.iloc[:,1:].values y=wine_data.iloc[:,0].values x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=125) dtr=KNeighborsClassifier() dtr.fit(x_train,y_train) dtr.score(x_test,y_test)

这段代码使用了scikit-learn库中的KNeighborsClassifier算法对wine_data数据集进行分类,并使用train_test_split函数将数据集分为训练集和测试集。其中x和y分别代表数据集的特征和标签,test_size表示测试集占总数据集的比例,random_state用于设定随机数生成器的种子,保证每次运行程序得到的随机数相同。dtr.fit()函数用于训练模型,dtr.score()函数用于计算模型的预测准确率。

#KNN最近邻分类算法 from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split x=wine_data.iloc[:,1:].values y=wine_data.iloc[:,0].values x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=125) dtr=KNeighborsClassifier() dtr.fit(x_train,y_train) dtr.score(x_test,y_test)

这段代码使用sklearn库中的K最近邻(K Nearest Neighbor,KNN)分类器对wine_data数据集进行分类建模。具体来说,代码首先从wine_data中分离出特征数据x和目标数据y,其中x为除第一列以外的所有列,y为第一列的数据。然后,使用train_test_split函数将x和y分别划分为训练集和测试集,其中test_size=0.3表示将30%的数据作为测试集,random_state=125表示随机种子,以确保每次划分结果相同。 接着,使用KNeighborsClassifier函数定义一个KNN分类器模型。然后,使用fit函数对训练集进行拟合,得到一个训练好的模型。最后,使用score函数计算模型在测试集上的精度,并将结果输出。 需要注意的是,KNN算法通过计算输入样本与训练集中所有样本之间的距离来确定输入样本的类别。因此,在实际应用中,需要根据数据集的特点选择合适的距离度量方式和K值,并对模型进行评估和调整,以提高模型的性能。
阅读全文

相关推荐

wine_data=data.iloc[:-5,:] wine_target=data.iloc[-5:,:] from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split x=wine_data.iloc[:,1:].values y=wine_data.iloc[:,0].values x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=42) #建立模型 dtc=DecisionTreeClassifier(criterion='entropy')#基于熵评价纯度 dtc.fit(x_train,y_train)#拟合数据 y_pre=dtc.predict(x_test) y_pre dtc.predict(wine_target.iloc[:,1:].values) from sklearn.metrics import mean_squared_error #先获得预测的y值y_pre _pre=dtc.Oredlct(y tact mean_squared_error(y_test,y_pre) print("决策树 训练精度:“,dtc.score(x_test,y_test)) print("决策树 泛化精度:“,dtc.score(x_train,y_train)) #KNN最近邻分类算法 from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split -wine_data.ilocl:,1:].values y=wine_data.iloc[:,0].values state=125) dtr=KNeighborsClassifier() dtr.fit(x_train,y_train) dtr.score(x_test,y_test) model_knn=KNeighborsClassifier(n_neighbors=5)#看5个近邻的类别确定分类 model knn.fit(x_train,y_train) #预测 model_knn.predict(x_test) dtr.predict(wine_target.iloc[:,1:].values) neighbors = 3 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(neighbors) knn.fit(x_train,y_train) print("KNN 训练精度:“,knn.score(x_test,y_test)) print("KNN泛化精度: knn.score(x_train,y_train))代码解释

In [16]: wine_data=data.iloc[:-5,:] wine_target=data.iloc[-5:,:] In [17]: from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split x=wine_data.iloc[:,1:].values y=wine_data.iloc[:,0].values x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=42) #建立模型 dtc=DecisionTreeClassifier(criterion='entropy')#基于熵评价纯度 dtc.fit(x_train,y_train)#拟合数据 y_pre=dtc.predict(x_test) y_pre Out[17]: array([3.0, 1.0, 3.0, 2.0, 2.0, 2.0, 2.0, 1.0, 3.0, 2.0, 3.0, 1.0, 2.0, 3.0, 2.0, 1.0, 2.0, 1.0, 3.0, 2.0, 2.0, 2.0, 2.0, 1.0, 3.0, 2.0, 3.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 2.0, 3.0, 3.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 3.0, 3.0]) In [18]: dtc.predict(wine_target.iloc[:,1:].values) Out[18]: array([2.0, 2.0, 2.0, 3.0, 1.0]) In [19]: from sklearn.metrics import mean_squared_error #先获得预测的y值y_pre y_pre=dtc.predict(x_test) mean_squared_error(y_test,y_pre) Out[19]: 0.0 In [20]: print("决策树 训练精度:",dtc.score(x_test,y_test)) print("决策树 泛化精度:",dtc.score(x_train,y_train)) 决策树 训练精度: 1.0 决策树 泛化精度: 1.0 In [21]: #KNN最近邻分类算法 from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split x=wine_data.iloc[:,1:].values y=wine_data.iloc[:,0].values x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=125) dtr=KNeighborsClassifier() dtr.fit(x_train,y_train) dtr.score(x_test,y_test) Out[21]: 0.9807692307692307 In [22]: model_knn=KNeighborsClassifier(n_neighbors=5)#看5个近邻的类别确定分类 model_knn.fit(x_train,y_train) #预测 model_knn.predict(x_test) Out[22]: array([3.0, 3.0, 1.0, 2.0, 1.0, 3.0, 3.0, 1.0, 2.0, 3.0, 2.0, 1.0, 2.0, 1.0, 2.0, 1.0, 2.0, 2.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 1.0, 2.0, 3.0, 3.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 3.0, 1.0, 3.0, 3.0, 2.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 3.0, 2.0, 1.0]) In [23]: dtr.predict(wine_target.iloc[:,1:].values) Out[23]: array([2.0, 2.0, 3.0, 3.0, 1.0]) In [24]: neighbors = 3 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(neighbors) knn.fit(x_train,y_train) print("KNN 训练精度:",knn.score(x_test,y_test)) print("KNN 泛化精度:",knn.score(x_train,y_train)) KNN 训练精度: 0.9615384615384616 KNN 泛化精度: 0.9586776859504132代码解释

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split, RepeatedKFold, cross_val_score from sklearn.ensemble import GradientBoostingRegressor, RandomForestRegressor from sklearn.svm import SVR from sklearn.tree import DecisionTreeRegressor from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, Matern from sklearn.metrics import mean_absolute_error, r2_score from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline from bayes_opt import BayesianOptimization import warnings # 忽略警告 warnings.filterwarnings('ignore') # 设置中文字体支持 plt.rcParams['font.sans-serif'] = ['Arial', 'Arial Unicode MS', 'Microsoft YaHei', 'sans-serif'] plt.rcParams['axes.unicode_minus'] = False sns.set_style("whitegrid") # 加载数据集 df = pd.read_csv('/Jupyter/BCC_HEA/alloy_properties.csv') features = ['mean_r', 'mean_electronegativity', 'mean_G', 'mean_vec', 'mean_delta','mean_delta_G'] targets = ['deta_E_mono','deta_E_di'] # 定义模型名称列表 model_names = ['GBR', 'SVR', 'DTR', 'RFR', 'GPR'] # 为每个目标变量进行操作 for target in targets: print(f"\n\n{'='*50}") print(f"开始处理目标变量: {target}") print(f"{'='*50}\n") # 数据拆分:训练集+验证集+测试集 X = df[features] y = df[target] # 拆分测试集(30%) X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 从训练集拆分验证集(20%用于调参) X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.2, random_state=42) # 存储模型性能 model_performance_before = {} model_performance_after = {} best_params_dict = {} # 1. 初始模型训练和评估(测试集指标为主) print(f"\n{'='*30} {target} - 原始模型性能 {'='*30}") # 定义初始模型 models = { 'GBR': GradientBoostingRegressor(random_state=42), 'SVR': make_pipeline(StandardScaler(), SVR(kernel='rbf')), 'DTR': DecisionTreeRegressor(random_state=42), 'RFR': RandomForestRegressor(random_state=42, n_jobs=-1), 'GPR': make_pipeline(StandardScaler(), GaussianProcessRegressor(random_state=42)) } # 打印原始模型的默认超参数 print(f'\n\n===== {target} - 原始模型的默认超参数 =====') for model_name, model in models.items(): print(f"\n{model_name} 的默认超参数:") default_params = model.get_params() for param, value in default_params.items(): print(f" {param}: {value}") # 训练和评估初始模型(测试集指标) for model_name in model_names: model = models[model_name] model.fit(X_train_full, y_train_full) # 完整训练集训练 # 预测 y_train_pred = model.predict(X_train_full) # 训练集预测 y_test_pred = model.predict(X_test) # 测试集预测 # 计算指标 train_mae = mean_absolute_error(y_train_full, y_train_pred) train_r2 = r2_score(y_train_full, y_train_pred) test_mae = mean_absolute_error(y_test, y_test_pred) test_r2 = r2_score(y_test, y_test_pred) # 交叉验证(可选,辅助参考) cv = RepeatedKFold(n_splits=5, n_repeats=3, random_state=42) cv_score = cross_val_score(model, X_train_full, y_train_full, cv=cv, scoring='neg_mean_absolute_error').mean() cv_mae = -cv_score # 存储性能 model_performance_before[model_name] = { 'Train MAE': train_mae, 'Train R2': train_r2, 'Test MAE': test_mae, 'Test R2': test_r2, 'CV MAE': cv_mae } # 打印结果 print(f"\n{model_name} 原始模型性能:") print(f" 训练集: MAE = {train_mae:.4f}, R² = {train_r2:.4f}") print(f" 测试集: MAE = {test_mae:.4f}, R² = {test_r2:.4f}") print(f" 交叉验证 MAE = {cv_mae:.4f}") # 绘制初始拟合图(训练+测试集) plt.figure(figsize=(8, 6)) plt.scatter(y_train_full, y_train_pred, alpha=0.7, label='training set', c='blue') plt.scatter(y_test, y_test_pred, alpha=0.7, label='test set', c='red') # 趋势线 all_y = np.concatenate([y_train_full, y_test]) all_pred = np.concatenate([y_train_pred, y_test_pred]) z = np.polyfit(all_y, all_pred, 1) p = np.poly1d(z) plt.plot(all_y, p(all_y), c='black', lw=2, linestyle='--') plt.xlabel('actual', fontsize=12) plt.ylabel('predicted', fontsize=12) plt.title(f'{target} - {model_name} (before optimization)', fontsize=14) # 标注指标 plt.text(0.05, 0.9, f'training MAE = {train_mae:.3f}, $R^2$ = {train_r2:.3f}', transform=plt.gca().transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8)) plt.text(0.05, 0.8, f'test set MAE = {test_mae:.3f}, $R^2$ = {test_r2:.3f}', transform=plt.gca().transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8)) plt.legend(fontsize=10) plt.tight_layout() plt.savefig(f'{target}_{model_name}_before_optimization.png', dpi=300) plt.show() # 2. 贝叶斯优化(验证集MAE为目标) print(f"\n{'='*30} {target} - 贝叶斯优化模型超参数 {'='*30}") # 超参数空间(保持原范围) pbounds_dict = { 'GBR': { 'n_estimators': (50, 500), 'learning_rate': (0.001, 0.3), 'max_depth': (2, 10), 'min_samples_split': (2, 20), 'min_samples_leaf': (1, 10) }, 'SVR': { 'logC': (0, 3), # C: 1-1000 'logGamma': (-3, 1), # gamma: 0.001-10 'epsilon': (0.01, 0.1) # ε范围 }, 'DTR': { 'max_depth': (2, 15), 'min_samples_split': (2, 20), 'min_samples_leaf': (1, 15), 'max_features': (0.3, 1.0) }, 'RFR': { 'n_estimators': (50, 300), 'max_depth': (3, 10), 'min_samples_split': (3, 8), 'min_samples_leaf': (1, 5), 'max_features': (0.5, 1.0) }, 'GPR': { 'kernel_type': (0, 1), # 0=RBF, 1=Matern 'log_length_scale': (-1, 2), # length_scale: 0.1-100 'log_alpha': (-3.5, -1.5), # alpha: 0.00001-1 'nu': (0.5, 2) # Matern核平滑度 } } # 目标函数:验证集MAE(最小化MAE → 最大化负MAE) def get_objective_function(model_name): def objective_function(**params): # 构建模型 if model_name == 'GBR': model = GradientBoostingRegressor( n_estimators=int(params['n_estimators']), learning_rate=params['learning_rate'], max_depth=int(params['max_depth']), min_samples_split=int(params['min_samples_split']), min_samples_leaf=int(params['min_samples_leaf']), random_state=42 ) elif model_name == 'SVR': C_val = 10 ** params['logC'] gamma_val = 10 ** params['logGamma'] model = make_pipeline( StandardScaler(), SVR(kernel='rbf', C=C_val, gamma=gamma_val, epsilon=params['epsilon']) ) elif model_name == 'DTR': model = DecisionTreeRegressor( max_depth=int(params['max_depth']), min_samples_split=int(params['min_samples_split']), min_samples_leaf=int(params['min_samples_leaf']), max_features=params['max_features'], random_state=42 ) elif model_name == 'RFR': model = RandomForestRegressor( n_estimators=int(params['n_estimators']), max_depth=int(params['max_depth']), min_samples_split=int(params['min_samples_split']), min_samples_leaf=int(params['min_samples_leaf']), max_features=params['max_features'], random_state=42, n_jobs=-1 ) elif model_name == 'GPR': kernel_type = int(round(params['kernel_type'])) length_scale = 10 ** params['log_length_scale'] alpha_val = 10 ** params['log_alpha'] if kernel_type == 0: kernel = RBF(length_scale=length_scale) else: kernel = Matern( length_scale=length_scale, nu=params['nu'] ) model = make_pipeline( StandardScaler(), GaussianProcessRegressor( kernel=kernel, alpha=alpha_val, n_restarts_optimizer=5, random_state=42 ) ) # 训练(用训练集)+ 验证(用验证集) model.fit(X_train, y_train) y_val_pred = model.predict(X_val) val_mae = mean_absolute_error(y_val, y_val_pred) return -val_mae # 最大化负MAE等价于最小化MAE return objective_function # 优化每个模型 for model_name in model_names: print(f"\n>>> 正在优化 {model_name} 模型...") optimizer = BayesianOptimization( f=get_objective_function(model_name), pbounds=pbounds_dict[model_name], random_state=42, allow_duplicate_points=True ) # 执行优化(增加迭代次数提升搜索充分性) optimizer.maximize( init_points=15, # 初始随机点从10→15 n_iter=30 # 迭代次数从20→30 ) # 获取最优参数 best_params = optimizer.max['params'] best_val_mae = -optimizer.max['target'] # 还原为MAE值 best_params_dict[model_name] = best_params print(f"\n{model_name} 最优超参数:") # 特殊参数转换显示 if model_name == 'SVR': print(f" C: {10**best_params['logC']:.4f} (logC: {best_params['logC']:.4f})") print(f" gamma: {10**best_params['logGamma']:.6f} (logGamma: {best_params['logGamma']:.4f})") print(f" epsilon: {best_params['epsilon']:.4f}") elif model_name == 'GPR': kernel_type = "RBF" if int(round(best_params['kernel_type'])) == 0 else "Matern" print(f" 核类型: {kernel_type}") print(f" length_scale: {10**best_params['log_length_scale']:.4f} (log: {best_params['log_length_scale']:.4f})") print(f" alpha: {10**best_params['log_alpha']:.6f} (log: {best_params['log_alpha']:.4f})") if kernel_type == "Matern": print(f" nu: {best_params['nu']:.4f}") else: for param, value in best_params.items(): if 'int' in str(type(value)) or param in ['n_estimators', 'max_depth', 'min_samples_split', 'min_samples_leaf']: print(f" {param}: {int(value)}") else: print(f" {param}: {value:.6f}") print(f"最优验证集 MAE: {best_val_mae:.4f}") # 3. 优化后模型评估(测试集指标为主) print(f"\n{'='*30} {target} - 优化后模型性能 {'='*30}") for model_name in model_names: best_params = best_params_dict[model_name] # 初始化优化后模型(同原逻辑) if model_name == 'GBR': optimized_model = GradientBoostingRegressor( n_estimators=int(best_params['n_estimators']), learning_rate=best_params['learning_rate'], max_depth=int(best_params['max_depth']), min_samples_split=int(best_params['min_samples_split']), min_samples_leaf=int(best_params['min_samples_leaf']), random_state=42 ) elif model_name == 'SVR': C_val = 10 ** best_params['logC'] gamma_val = 10 ** best_params['logGamma'] optimized_model = make_pipeline( StandardScaler(), SVR(kernel='rbf', C=C_val, gamma=gamma_val, epsilon=best_params['epsilon']) ) elif model_name == 'DTR': optimized_model = DecisionTreeRegressor( max_depth=int(best_params['max_depth']), min_samples_split=int(best_params['min_samples_split']), min_samples_leaf=int(best_params['min_samples_leaf']), max_features=best_params['max_features'], random_state=42 ) elif model_name == 'RFR': optimized_model = RandomForestRegressor( n_estimators=int(best_params['n_estimators']), max_depth=int(best_params['max_depth']), min_samples_split=int(best_params['min_samples_split']), min_samples_leaf=int(best_params['min_samples_leaf']), max_features=best_params['max_features'], random_state=42, n_jobs=-1 ) elif model_name == 'GPR': kernel_type = int(round(best_params['kernel_type'])) length_scale = 10 ** best_params['log_length_scale'] alpha_val = 10 ** best_params['log_alpha'] if kernel_type == 0: kernel = RBF(length_scale=length_scale) else: kernel = Matern( length_scale=length_scale, nu=best_params['nu'] ) optimized_model = make_pipeline( StandardScaler(), GaussianProcessRegressor( kernel=kernel, alpha=alpha_val, n_restarts_optimizer=5, random_state=42 ) ) # 训练:用完整训练集(训练+验证) optimized_model.fit(X_train_full, y_train_full) # 预测测试集 y_test_pred = optimized_model.predict(X_test) # 预测训练集(可选) y_train_full_pred = optimized_model.predict(X_train_full) # 计算指标 train_mae = mean_absolute_error(y_train_full, y_train_full_pred) train_r2 = r2_score(y_train_full, y_train_full_pred) test_mae = mean_absolute_error(y_test, y_test_pred) test_r2 = r2_score(y_test, y_test_pred) # 交叉验证(可选) cv = RepeatedKFold(n_splits=5, n_repeats=3, random_state=42) cv_score = cross_val_score(optimized_model, X_train_full, y_train_full, cv=cv, scoring='neg_mean_absolute_error').mean() cv_mae = -cv_score # 存储性能 model_performance_after[model_name] = { 'Train MAE': train_mae, 'Train R2': train_r2, 'Test MAE': test_mae, 'Test R2': test_r2, 'CV MAE': cv_mae } # 打印结果 print(f"\n{model_name} 优化后模型性能:") print(f" 训练集: MAE = {train_mae:.4f}, R² = {train_r2:.4f}") print(f" 测试集: MAE = {test_mae:.4f}, R² = {test_r2:.4f}") print(f" 交叉验证 MAE = {cv_mae:.4f}") # 绘制优化后拟合图(训练+测试集) plt.figure(figsize=(8, 6)) plt.scatter(y_train_full, y_train_full_pred, alpha=0.7, label='training set', c='blue') plt.scatter(y_test, y_test_pred, alpha=0.7, label='test set', c='red') # 趋势线 all_y = np.concatenate([y_train_full, y_test]) all_pred = np.concatenate([y_train_full_pred, y_test_pred]) z = np.polyfit(all_y, all_pred, 1) p = np.poly1d(z) plt.plot(all_y, p(all_y), c='black', lw=2, linestyle='--') plt.xlabel('actual', fontsize=12) plt.ylabel('predicted', fontsize=12) plt.title(f'{target} - {model_name} (after optimization)', fontsize=14) # 标注指标 plt.text(0.05, 0.9, f'training MAE = {train_mae:.3f}, $R^2$ = {train_r2:.3f}', transform=plt.gca().transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8)) plt.text(0.05, 0.8, f'test set MAE = {test_mae:.3f}, $R^2$ = {test_r2:.3f}', transform=plt.gca().transAxes, fontsize=10, bbox=dict(facecolor='white', alpha=0.8)) plt.legend(fontsize=10) plt.tight_layout() plt.savefig(f'{target}_{model_name}_after_optimization.png', dpi=300) plt.show() # 4. 性能对比分析(测试集指标为主) print(f"\n{'='*30} {target} - 优化前后模型性能对比 {'='*30}") # 构建对比数据 comparison_data = [] for model_name in model_names: before = model_performance_before[model_name] after = model_performance_after[model_name] # 计算提升率 mae_test_improve = (before['Test MAE'] - after['Test MAE']) / before['Test MAE'] * 100 if before['Test MAE'] != 0 else 0 r2_test_improve = (after['Test R2'] - before['Test R2']) * 100 # 百分点 comparison_data.append({ '模型': model_name, '优化前测试MAE': before['Test MAE'], '优化后测试MAE': after['Test MAE'], 'MAE提升(%)': mae_test_improve, '优化前测试R²': before['Test R2'], '优化后测试R²': after['Test R2'], 'R²提升(百分点)': r2_test_improve, '优化前交叉验证MAE': before['CV MAE'], '优化后交叉验证MAE': after['CV MAE'] }) comparison_df = pd.DataFrame(comparison_data) print("\n模型性能对比表:") print(comparison_df.round(4)) # 保存对比结果 comparison_df.to_csv(f'model_comparison_{target}.csv', index=False) # 绘制测试集MAE对比 plt.figure(figsize=(12, 8)) width = 0.35 x = np.arange(len(model_names)) plt.bar(x - width/2, comparison_df['优化前测试MAE'], width, label='before optimization', color='skyblue') plt.bar(x + width/2, comparison_df['优化后测试MAE'], width, label='after optimization', color='lightcoral') # 数据标签 for i, (before, after) in enumerate(zip(comparison_df['优化前测试MAE'], comparison_df['优化后测试MAE'])): plt.text(i - width/2, before + 0.005, f'{before:.4f}', ha='center') plt.text(i + width/2, after + 0.005, f'{after:.4f}', ha='center') # 提升百分比 improvement = (before - after) / before * 100 if before != 0 else 0 plt.text(i, max(before, after) + 0.01, f'{improvement:.1f}%', ha='center', fontsize=10, color='green' if improvement > 0 else 'red') plt.xlabel('Model', fontsize=12) plt.ylabel('test set MAE', fontsize=12) plt.title(f'{target} - before/after optimization test set MAE comparison', fontsize=14) plt.xticks(x, model_names) plt.legend() plt.tight_layout() plt.savefig(f'{target}_MAE_comparison.png', dpi=300) plt.show() # 绘制测试集R²对比 plt.figure(figsize=(12, 8)) plt.bar(x - width/2, comparison_df['优化前测试R²'], width, label='before optimization', color='skyblue') plt.bar(x + width/2, comparison_df['优化后测试R²'], width, label='after optimization', color='lightcoral') # 数据标签 for i, (before, after) in enumerate(zip(comparison_df['优化前测试R²'], comparison_df['优化后测试R²'])): plt.text(i - width/2, before + 0.01, f'{before:.4f}', ha='center') plt.text(i + width/2, after + 0.01, f'{after:.4f}', ha='center') # 提升百分点 improvement = (after - before) * 100 plt.text(i, max(before, after) + 0.02, f'+{improvement:.1f}pp' if improvement > 0 else f'{improvement:.1f}pp', ha='center', fontsize=10, color='green' if improvement > 0 else 'red') plt.xlabel('Model', fontsize=12) plt.ylabel('test set R²', fontsize=12) plt.title(f'{target} - before/after optimization test set R² comparison', fontsize=14) plt.xticks(x, model_names) plt.legend() plt.tight_layout() plt.savefig(f'{target}_R2_comparison.png', dpi=300) plt.show() # 交叉验证MAE对比(可选) all_cv_scores = [] for model_name in model_names: before_score = model_performance_before[model_name]['CV MAE'] after_score = model_performance_after[model_name]['CV MAE'] all_cv_scores.append([model_name + '_before', before_score]) all_cv_scores.append([model_name + '_after', after_score]) cv_df = pd.DataFrame(all_cv_scores, columns=['Model', 'CV MAE']) plt.figure(figsize=(12, 6)) sns.boxplot(x='Model', y='CV MAE', data=cv_df) plt.title('Cross-Validation MAE Comparison Before and After Optimization') plt.ylabel('MAE') plt.tight_layout() plt.savefig(f'{target}_cv_comparison.png', dpi=300) plt.show() print("\n所有模型优化完成!")修改上述贝叶斯优化模型前后的结果比较,不适用交叉验证

dtc.predict(wine_target.iloc[:,1:].values) Out[33]: array([2., 2., 2., 3., 1.]) In [34]: from sklearn.metrics import mean_squared_error #先获得预测的y值y_pre y_pre=dtc.predict(x_test) mean_squared_error(y_test,y_pre) Out[34]: 0.0 In [35]: print("决策树 训练精度:",dtc.score(x_test,y_test)) print("决策树 泛化精度:",dtc.score(x_train,y_train)) 决策树 训练精度: 1.0 决策树 泛化精度: 1.0 In [39]: #KNN最近邻分类算法 from sklearn.neighbors import KNeighborsClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split x=wine_data.iloc[:,1:].values y=wine_data.iloc[:,0].values x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=125) dtr=KNeighborsClassifier() dtr.fit(x_train,y_train) dtr.score(x_test,y_test) Out[39]: 0.9807692307692307 In [42]: model_knn=KNeighborsClassifier(n_neighbors=5)#看5个近邻的类别确定分类 model_knn.fit(x_train,y_train) #预测 model_knn.predict(x_test) Out[42]: array([3., 3., 1., 2., 1., 3., 3., 1., 2., 3., 2., 1., 2., 1., 2., 1., 2., 2., 3., 1., 1., 3., 1., 2., 1., 2., 3., 3., 2., 2., 1., 1., 2., 1., 1., 2., 3., 1., 3., 3., 2., 2., 2., 2., 1., 1., 1., 1., 2., 3., 2., 1.]) In [43]: dtr.predict(wine_target.iloc[:,1:].values) Out[43]: array([2., 2., 3., 3., 1.]) In [41]: neighbors = 3 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(neighbors) knn.fit(x_train,y_train) print("KNN 训练精度:",knn.score(x_test,y_test)) print("KNN 泛化精度:",knn.score(x_train,y_train)) KNN 训练精度: 0.9615384615384616 KNN 泛化精度: 0.9586776859504132

最新推荐

recommend-type

基于C语言的RS232串行接口通信实现_葛磊蛟.pdf

RS232接口通常包含9个或25个引脚,常见的9针D型接头包含了基本的数据传输和控制线,如数据接收(DSR)、数据发送(DTR)、请求发送(RTS)和清除接收(CTS)等。 C语言作为通用编程语言,因其结构清晰、效率高而常用于串行...
recommend-type

造纸机变频分布传动与Modbus RTU通讯技术的应用及其实现

造纸机变频分布传动与Modbus RTU通讯技术的应用及其优势。首先,文中解释了变频分布传动系统的组成和功能,包括采用PLC(如S7-200SMART)、变频器(如英威腾、汇川、ABB)和触摸屏(如昆仑通泰)。其次,重点阐述了Modbus RTU通讯协议的作用,它不仅提高了系统的可靠性和抗干扰能力,还能实现对造纸机各个生产环节的精确监控和调节。最后,强调了该技术在提高造纸机运行效率、稳定性和产品质量方面的显著效果,适用于多种类型的造纸机,如圆网造纸机、长网多缸造纸机和叠网多缸造纸机。 适合人群:从事造纸机械制造、自动化控制领域的工程师和技术人员。 使用场景及目标:① 提升造纸机的自动化水平;② 实现对造纸机的精确控制,确保纸张质量和生产效率;③ 改善工业现场的数据传输和监控功能。 其他说明:文中提到的具体品牌和技术细节有助于实际操作和维护,同时也展示了该技术在不同纸厂的成功应用案例。
recommend-type

langchain4j-neo4j-0.29.1.jar中文文档.zip

1、压缩文件中包含: 中文文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。
recommend-type

基于STC89C52单片机的智能衣架电路设计:服装店顾客行为数据分析与传输

内容概要:本文介绍了一种基于STC89C52单片机的智能衣架电路设计方案,旨在通过采集和分析顾客在服装店挑选和试穿衣物时的行为数据,帮助商家更好地了解顾客的购物习惯和偏好。该系统利用ADXL345三轴加速度传感器和HX711称重传感器分别检测衣架的角度变化和重量变化,记录服装被挑选和试穿的次数,并通过LCD1602显示屏实时显示这些数据。此外,蓝牙模块将数据传输到手机,方便店员和顾客查看。文中还简述了系统的硬件连接和软件代码设计。 适合人群:电子工程技术人员、嵌入式系统开发者、从事零售数据分析的专业人士。 使用场景及目标:适用于服装零售行业,帮助商家优化库存管理、提升顾客购物体验以及进行精准营销。通过对顾客行为数据的实时采集和分析,商家可以制定更有针对性的销售策略。 其他说明:本文不仅提供了详细的硬件原理图,还涉及了单片机编程的相关知识,有助于读者全面掌握智能衣架的设计与实现方法。
recommend-type

Visual C++.NET编程技术实战指南

根据提供的文件信息,可以生成以下知识点: ### Visual C++.NET编程技术体验 #### 第2章 定制窗口 - **设置窗口风格**:介绍了如何通过编程自定义窗口的外观和行为。包括改变窗口的标题栏、边框样式、大小和位置等。这通常涉及到Windows API中的`SetWindowLong`和`SetClassLong`函数。 - **创建六边形窗口**:展示了如何创建一个具有特殊形状边界的窗口,这类窗口不遵循标准的矩形形状。它需要使用`SetWindowRgn`函数设置窗口的区域。 - **创建异形窗口**:扩展了定制窗口的内容,提供了创建非标准形状窗口的方法。这可能需要创建一个不规则的窗口区域,并将其应用到窗口上。 #### 第3章 菜单和控制条高级应用 - **菜单编程**:讲解了如何创建和修改菜单项,处理用户与菜单的交互事件,以及动态地添加或删除菜单项。 - **工具栏编程**:阐述了如何使用工具栏,包括如何创建工具栏按钮、分配事件处理函数,并实现工具栏按钮的响应逻辑。 - **状态栏编程**:介绍了状态栏的创建、添加不同类型的指示器(如文本、进度条等)以及状态信息的显示更新。 - **为工具栏添加皮肤**:展示了如何为工具栏提供更加丰富的视觉效果,通常涉及到第三方的控件库或是自定义的绘图代码。 #### 第5章 系统编程 - **操作注册表**:解释了Windows注册表的结构和如何通过程序对其进行读写操作,这对于配置软件和管理软件设置非常关键。 - **系统托盘编程**:讲解了如何在系统托盘区域创建图标,并实现最小化到托盘、从托盘恢复窗口的功能。 - **鼠标钩子程序**:介绍了钩子(Hook)技术,特别是鼠标钩子,如何拦截和处理系统中的鼠标事件。 - **文件分割器**:提供了如何将文件分割成多个部分,并且能够重新组合文件的技术示例。 #### 第6章 多文档/多视图编程 - **单文档多视**:展示了如何在同一个文档中创建多个视图,这在文档编辑软件中非常常见。 #### 第7章 对话框高级应用 - **实现无模式对话框**:介绍了无模式对话框的概念及其应用场景,以及如何实现和管理无模式对话框。 - **使用模式属性表及向导属性表**:讲解了属性表的创建和使用方法,以及如何通过向导性质的对话框引导用户完成多步骤的任务。 - **鼠标敏感文字**:提供了如何实现点击文字触发特定事件的功能,这在阅读器和编辑器应用中很有用。 #### 第8章 GDI+图形编程 - **图像浏览器**:通过图像浏览器示例,展示了GDI+在图像处理和展示中的应用,包括图像的加载、显示以及基本的图像操作。 #### 第9章 多线程编程 - **使用全局变量通信**:介绍了在多线程环境下使用全局变量进行线程间通信的方法和注意事项。 - **使用Windows消息通信**:讲解了通过消息队列在不同线程间传递信息的技术,包括发送消息和处理消息。 - **使用CriticalSection对象**:阐述了如何使用临界区(CriticalSection)对象防止多个线程同时访问同一资源。 - **使用Mutex对象**:介绍了互斥锁(Mutex)的使用,用以同步线程对共享资源的访问,保证资源的安全。 - **使用Semaphore对象**:解释了信号量(Semaphore)对象的使用,它允许一个资源由指定数量的线程同时访问。 #### 第10章 DLL编程 - **创建和使用Win32 DLL**:介绍了如何创建和链接Win32动态链接库(DLL),以及如何在其他程序中使用这些DLL。 - **创建和使用MFC DLL**:详细说明了如何创建和使用基于MFC的动态链接库,适用于需要使用MFC类库的场景。 #### 第11章 ATL编程 - **简单的非属性化ATL项目**:讲解了ATL(Active Template Library)的基础使用方法,创建一个不使用属性化组件的简单项目。 - **使用ATL开发COM组件**:详细阐述了使用ATL开发COM组件的步骤,包括创建接口、实现类以及注册组件。 #### 第12章 STL编程 - **list编程**:介绍了STL(标准模板库)中的list容器的使用,讲解了如何使用list实现复杂数据结构的管理。 #### 第13章 网络编程 - **网上聊天应用程序**:提供了实现基本聊天功能的示例代码,包括客户端和服务器的通信逻辑。 - **简单的网页浏览器**:演示了如何创建一个简单的Web浏览器程序,涉及到网络通信和HTML解析。 - **ISAPI服务器扩展编程**:介绍了如何开发ISAPI(Internet Server API)服务器扩展来扩展IIS(Internet Information Services)的功能。 #### 第14章 数据库编程 - **ODBC数据库编程**:解释了ODBC(开放数据库互联)的概念,并提供了使用ODBC API进行数据库访问的示例。 - **ADO编程**:介绍了ADO(ActiveX Data Objects)技术,讲解了如何使用ADO进行数据库的增删改查等操作。 #### 第15章 HTML帮助系统编程 - **创建HTML帮助文件**:讲解了如何创建HTML帮助文件(.chm),这是微软帮助系统的一种形式。 - **区分上下文帮助**:提供了在应用程序中实现上下文敏感帮助的技术示例。 #### 第16章 安装和部署项目 - **用安装程序向导创建安装项目**:介绍了如何使用Visual Studio中的安装和部署项目向导,快速创建安装程序。 - **部署应用程序**:阐述了部署应用程序到目标系统的过程,以及如何确保应用程序的正确安装和运行。 以上内容涵盖了Visual C++.NET编程技术体验一书中涉及的各个技术点,并对每个章节中的示例做了详细的说明。这些知识点对于理解和掌握Visual C++.NET编程非常重要,并能够帮助读者在实际项目开发中应用这些技术。
recommend-type

HarmonyOS内核深度探秘:优化自由行旅游系统的策略

# 1. HarmonyOS内核概述与旅游系统需求分析 ## 1.1 HarmonyOS内核概述 HarmonyOS(鸿蒙操作系统)是由华为开发的一个分布式操作系统,旨在提供跨多种设备的无缝体验。其内核设计理念强调高效、安全和模块化,以微内核架构和分布式能力
recommend-type

tkinter模块所有控件

<think>好的,我现在需要回答用户关于Tkinter模块中所有控件列表的问题。首先,我需要回忆Tkinter的基础知识,确保自己了解各个控件的名称和用途。用户希望得到所有支持的控件列表,所以必须全面覆盖,不能遗漏。 首先,我应该从Tkinter的标准控件开始。常见的控件包括Label、Button、Entry这些基础部件。然后是Frame,用于布局,还有Canvas用于绘图。接下来是Checkbutton、Radiobutton,这些属于选择类控件。Listbox和Scrollbar通常一起使用,处理滚动内容。还有Scale(滑块)、Spinbox、Menu、Menubutton这些可能
recommend-type

局域网五子棋游戏:娱乐与聊天的完美结合

标题“网络五子棋”和描述“适合于局域网之间娱乐和聊天!”以及标签“五子棋 网络”所涉及的知识点主要围绕着五子棋游戏的网络版本及其在局域网中的应用。以下是详细的知识点: 1. 五子棋游戏概述: 五子棋是一种两人对弈的纯策略型棋类游戏,又称为连珠、五子连线等。游戏的目标是在一个15x15的棋盘上,通过先后放置黑白棋子,使得任意一方先形成连续五个同色棋子的一方获胜。五子棋的规则简单,但策略丰富,适合各年龄段的玩家。 2. 网络五子棋的意义: 网络五子棋是指可以在互联网或局域网中连接进行对弈的五子棋游戏版本。通过网络版本,玩家不必在同一地点即可进行游戏,突破了空间限制,满足了现代人们快节奏生活的需求,同时也为玩家们提供了与不同对手切磋交流的机会。 3. 局域网通信原理: 局域网(Local Area Network,LAN)是一种覆盖较小范围如家庭、学校、实验室或单一建筑内的计算机网络。它通过有线或无线的方式连接网络内的设备,允许用户共享资源如打印机和文件,以及进行游戏和通信。局域网内的计算机之间可以通过网络协议进行通信。 4. 网络五子棋的工作方式: 在局域网中玩五子棋,通常需要一个客户端程序(如五子棋.exe)和一个服务器程序。客户端负责显示游戏界面、接受用户输入、发送落子请求给服务器,而服务器负责维护游戏状态、处理玩家的游戏逻辑和落子请求。当一方玩家落子时,客户端将该信息发送到服务器,服务器确认无误后将更新后的棋盘状态传回给所有客户端,更新显示。 5. 五子棋.exe程序: 五子棋.exe是一个可执行程序,它使得用户可以在个人计算机上安装并运行五子棋游戏。该程序可能包含了游戏的图形界面、人工智能算法(如果支持单机对战AI的话)、网络通信模块以及游戏规则的实现。 6. put.wav文件: put.wav是一个声音文件,很可能用于在游戏进行时提供声音反馈,比如落子声。在网络环境中,声音文件可能被用于提升玩家的游戏体验,尤其是在局域网多人游戏场景中。当玩家落子时,系统会播放.wav文件中的声音,为游戏增添互动性和趣味性。 7. 网络五子棋的技术要求: 为了确保多人在线游戏的顺利进行,网络五子棋需要具备一些基本的技术要求,包括但不限于稳定的网络连接、高效的数据传输协议(如TCP/IP)、以及安全的数据加密措施(如果需要的话)。此外,还需要有一个良好的用户界面设计来提供直观和舒适的用户体验。 8. 社交与娱乐: 网络五子棋除了是一个娱乐游戏外,它还具有社交功能。玩家可以通过游戏内的聊天系统进行交流,分享经验和策略,甚至通过网络寻找新的朋友。这使得网络五子棋不仅是一个个人娱乐工具,同时也是一种社交活动。 总结来说,网络五子棋结合了五子棋游戏的传统魅力和现代网络技术,使得不同地区的玩家能够在局域网内进行娱乐和聊天,既丰富了人们的娱乐生活,又加强了人际交流。而实现这一切的基础在于客户端程序的设计、服务器端的稳定运行、局域网的高效通信,以及音效文件增强的游戏体验。
recommend-type

自由行旅游新篇章:HarmonyOS技术融合与系统架构深度解析

# 1. HarmonyOS技术概述 ## 1.1 HarmonyOS的起源与发展 HarmonyOS(鸿蒙操作系统)由华为公司开发,旨在构建全场景分布式OS,以应对不同设备间的互联问题。自从2019年首次发布以来,HarmonyOS迅速成长,并迅速应用于智能手机、平板、智能穿戴、车载设备等多种平台。该系
recommend-type

足底支撑相到达73%是什么问题

<think>好的,我现在要处理用户的问题:“足底支撑相达到73%可能的原因及影响”。首先,需要理解用户提到的“足底支撑相73%”具体指什么。足底支撑相通常指步态周期中脚与地面接触的时间占比,正常范围大约在60%-62%左右。如果达到73%,明显超出正常范围,可能意味着步态异常。 接下来,需要确定可能的原因。可能的原因包括生物力学异常,比如足弓异常(扁平足或高弓足)、踝关节活动度受限,或者肌肉力量不足,特别是小腿和足部肌肉。另外,神经系统疾病如脑卒中或帕金森病可能影响步态控制。骨骼关节问题如关节炎、髋膝关节病变也可能导致支撑时间延长。还有代偿性步态,比如因疼痛或受伤而改变步态模式。 然后是