Commit 471d171f by 靓靓

upload files

parent 18e947f5
++ "b/6-\346\250\241\345\236\213\350\256\255\347\273\203/.gitkeep"
# 课上补充资料:
# 课上补充资料:
https://github.com/jindongwang/transferlearning
https://github.com/PacktPublishing/Ensemble-Machine-Learning/tree/master
{
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 0\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:19<00:00, 23.49it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:19<00:00, 23.56it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 2\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:19<00:00, 23.55it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 3\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:19<00:00, 23.47it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 4\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.31it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 5\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.63it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 6\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.93it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 7\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.11it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 8\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.12it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 9\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.14it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 10\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.91it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 11\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.70it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 12\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.87it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 13\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:19<00:00, 23.51it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 14\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.15it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 15\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.94it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 16\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.05it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 17\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.10it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 18\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.40it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 19\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.91it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 20\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.09it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 21\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.98it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 22\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.05it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 23\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.95it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 24\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.93it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 25\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.56it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 26\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 22.65it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 27\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.12it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 28\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.05it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"training epoch: 29\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 469/469 [00:20<00:00, 23.01it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"模型保存成功\n",
"生成模型重载成功\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
]
}
],
"source": [
"import torch\n",
"import torchvision\n",
"import torch.nn as nn\n",
"import torch.nn.functional as F\n",
"from torch.utils.data import DataLoader\n",
"from torchvision import datasets\n",
"from torch.optim import Adam\n",
"import argparse\n",
"from tqdm import tqdm\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
" \n",
"def download():\n",
" # 将图片转化为张量以及归一化处理\n",
" Trans = torchvision.transforms.Compose(\n",
" [torchvision.transforms.ToTensor(), torchvision.transforms.Normalize(mean=[0.5], std=[0.5])])\n",
" \n",
" # 下载MNIST对应的训练和测试数据集\n",
" train_data = datasets.FashionMNIST(\n",
" root=\"data\",\n",
" train=True,\n",
" download=True,\n",
" transform=Trans,\n",
" )\n",
" \n",
" test_data = datasets.FashionMNIST(\n",
" root=\"data\",\n",
" train=False,\n",
" download=True,\n",
" transform=Trans,\n",
" )\n",
" \n",
" train_Dataloader = DataLoader(train_data,batch_size=128)\n",
" test_Dataloader = DataLoader(test_data,batch_size=999999)\n",
" \n",
" return train_Dataloader, test_Dataloader, train_data, test_data\n",
" \n",
" \n",
"class Discriminator(nn.Module):\n",
" def __init__(self):\n",
" super(Discriminator, self).__init__()\n",
" self.judge = nn.Sequential(nn.Linear(28*28,512), nn.ReLU(), nn.Linear(512,256), nn.ReLU(), nn.Linear(256,32), nn.ReLU(), nn.Linear(32,1), nn.Sigmoid())\n",
" \n",
" def forward(self,image):\n",
" y = self.judge(image)\n",
" return y\n",
" \n",
" \n",
" \n",
"class Generator(nn.Module):\n",
" def __init__(self):\n",
" super(Generator, self).__init__()\n",
" self.generate = nn.Sequential(nn.Linear(100,256), nn.ReLU(), nn.Linear(256,512), nn.ReLU(), nn.Linear(512,28*28))\n",
" \n",
" def forward(self, x):\n",
" image = self.generate(x)\n",
" return image\n",
" \n",
" \n",
"def train(descriminator, generator, d_optimizer, g_optimizer, train_dataloader, loss_function):\n",
" for real_image,_ in tqdm(train_dataloader):\n",
" real_image = real_image.to('cuda')\n",
" real_image = real_image.reshape(-1,28*28)\n",
" \n",
" # 先看判别器损失\n",
" real_label = descriminator(real_image)\n",
" d_loss_real = loss_function(real_label, torch.ones_like(real_label))\n",
" \n",
" random_tensor = torch.randn(real_image.size(0),100).to('cuda')\n",
" fake_image = generator(random_tensor)\n",
" fake_label = descriminator(fake_image.detach())\n",
" d_loss_fake = loss_function(fake_label, torch.zeros_like(fake_label))\n",
" \n",
" d_loss = d_loss_real + d_loss_fake\n",
" d_optimizer.zero_grad()\n",
" d_loss.backward()\n",
" d_optimizer.step()\n",
" \n",
" \n",
" # 生成器损失\n",
" fake_label = descriminator(fake_image)\n",
" g_loss = loss_function(fake_label, torch.ones_like(fake_label))\n",
" \n",
" g_optimizer.zero_grad()\n",
" g_loss.backward()\n",
" g_optimizer.step()\n",
" \n",
" \n",
" \n",
"if __name__ == \"__main__\":\n",
" train_dataloader, test_dataloader, train_data, test_data = download()\n",
" \n",
" device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
" \n",
" descriminator = Discriminator().to(device)\n",
" generator = Generator().to(device)\n",
" \n",
" loss_function = nn.BCELoss()\n",
" \n",
" d_optimizer = Adam(descriminator.parameters(), lr=0.001)\n",
" g_optimizer = Adam(generator.parameters(), lr=0.001)\n",
" \n",
" epochs = 30\n",
" for epoch in range(epochs):\n",
" print(\"training epoch:\",epoch)\n",
" train(descriminator, generator, d_optimizer, g_optimizer, train_dataloader, loss_function)\n",
" \n",
" \n",
" torch.save(generator.state_dict(),'./generator.pth')\n",
" torch.save(descriminator.state_dict(),'./descriminator.pth')\n",
" print(\"模型保存成功\")\n",
" \n",
" new_generator = Generator()\n",
" new_generator.load_state_dict(torch.load('./generator.pth'))\n",
" print(\"生成模型重载成功\")\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"生成模型重载成功\n"
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import torch\n",
"\n",
"import torchvision\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
" \n",
"new_generator = Generator()\n",
"new_generator.load_state_dict(torch.load('./generator.pth'))\n",
"print(\"生成模型重载成功\")\n",
" \n",
"with torch.no_grad():\n",
" x = torch.randn(16, 100)\n",
" fake = new_generator(x)\n",
" \n",
" fake = fake.reshape(-1, 1, 28, 28)\n",
" img_grid_fake = torchvision.utils.make_grid(fake, normalize=True)\n",
" \n",
" # 将图像张量转换为 NumPy 数组\n",
" img_grid_fake_np = img_grid_fake.cpu().numpy()\n",
" img_grid_fake_np = np.transpose(img_grid_fake_np, (1, 2, 0))\n",
" \n",
" # 使用 matplotlib 显示图像\n",
" plt.figure(figsize=(10, 10))\n",
" plt.imshow(img_grid_fake_np)\n",
" plt.axis('off') # 不显示坐标轴\n",
" plt.show()\n",
" "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "geognn",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.19"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
38.3,5,3.4,37.3,72.1,11.9,16,500,10,80
38.3,5,3.4,37.3,72.1,11.9,16,500,10,80
41.7,5.8,3,22.7,64.6,8.7,26,800,20,40
38.3,5,3.4,37.3,72.1,11.9,16,400,10,70
35.7,5.2,3.5,25.4,60.7,4.6,29.5,650,60,10.83333333
20.3,2.7,3.4,27,50.3,3.9,45.8,600,20,90
28,3.4,4,10.3,38,7.9,46.8,575,28.75,20
23.97,3.59,4.27,5.33,37.93,4.03,58.04,650,13,50
41.7,5.8,3,22.7,64.6,8.7,26,700,20,35
34.375,5.35,36.97,2.32,73.775,5.2475,36.94709524,500,15,120
26.638,4.733,17.513,4.355,53.9876699,7.92815534,43.761,500,10,120
41.185,5.59,40.61,1.94,81.605,7.7225,36.94709524,600,15,120
38.3,5,3.4,37.3,72.1,11.9,16,300,10,60
35.5,5.5,5.1,27.2,63,12.1,24.9,700,10,60
30.2,4.3,4.8,21.4,48.8,3.1,38.1,350,35,10
41.7,5.8,3,22.7,64.6,8.7,26,900,20,45
38.1,5,5.8,15,64.8,5.3,29.9,450,11.25,40
37.78,5.47,38.79,2.13,77.69,6.485,36.94709524,700,15,120
35.7,5.2,3.5,25.4,60.7,4.6,29.5,450,5,90
41.185,5.59,40.61,1.94,81.605,7.7225,36.94709524,400,15,120
33.29,5.06,5.14,16.91,52.08,6.26,35.74,550,12.2,45
20.3,2.7,3.4,27,50.3,3.9,45.8,500,20,85
23.97,3.59,4.27,5.33,37.93,4.03,58.04,550,11,50
24.67,4.65,4.51,18.6,51.44,5.68,46.62,500,15,40
34.375,5.35,36.97,2.32,73.775,5.2475,36.94709524,700,15,120
35.7,5.2,3.5,25.4,60.7,4.6,29.5,450,60,7.5
35.8975,5.1575,30.01,3.6525,53.9876699,7.92815534,25.275,500,10,120
26.52,6.24,4.08,20.24,40.3,8.7,42,700,10,60
35.5,5.5,5.1,27.2,63,12.1,24.9,600,10,60
41.185,5.59,40.61,1.94,81.605,7.7225,36.94709524,500,15,120
41.26,5.425,31.3,3.195,53.9876699,7.92815534,18.82,500,10,120
22.3,3.6,2.8,16.6,41,5.7,53.3,500,10,60
46.615,5.6925,32.59,2.7375,53.9876699,7.92815534,12.365,500,10,120
37.78,5.47,38.79,2.13,77.69,6.485,36.94709524,400,15,120
9.1,0.86,1.5,10.2,18.8,2.8,78.4,700,20,95
52.3,8,6.7,32.3,62.3,6.5,31.2,1040,74.3,24
41.7,5.8,3,22.7,64.6,8.7,26,600,20,30
41.61,5.19,5.61,26.01,64.15,15.57,20.28,600,20,30
41.7,5.8,3,22.7,64.6,8.7,26,500,20,25
21.5,3.3,3.6,16.8,43.3,1.9,54.8,600,20,90
21.5,3.3,3.6,16.8,43.3,1.9,54.8,500,20,85
23.97,3.59,4.27,5.33,37.93,4.03,58.04,450,9,50
20.3,2.7,3.4,27,50.3,3.9,45.8,400,20,80
32.074,4.979,22.859,3.565,53.9876699,7.92815534,36.523,500,10,120
41.7,5.8,3,22.7,64.6,8.7,26,400,20,20
37.78,5.47,38.79,2.13,77.69,6.485,36.94709524,600,15,120
17.6,2.5,3.1,16.1,34.1,5.9,60,500,20,85
34.375,5.35,36.97,2.32,73.775,5.2475,36.94709524,400,15,120
9.1,0.86,1.5,10.2,18.8,2.8,78.4,600,20,90
17.6,2.5,3.1,16.1,34.1,5.9,60,400,20,80
33.292,5.102,25.532,3.17,53.9876699,7.92815534,32.904,500,10,120
26.52,6.24,4.08,20.24,40.3,8.7,42,400,10,60
35.5,5.5,5.1,27.2,63,12.1,24.9,500,10,60
24.67,4.65,4.51,18.6,51.44,5.68,46.62,300,15,40
34.375,5.35,36.97,2.32,73.775,5.2475,36.94709524,600,15,120
30.2,4.3,4.8,21.4,48.8,3.1,38.1,450,45,10
22.3,3.6,2.8,16.6,41,5.7,53.3,600,10,60
47.07,3.91,2.29,44.4,70.4,6.21,11.84,600,25,25
25.5,4.5,4.9,25.9,54.2,8.6,37.2,500,50,10
12.79,1.74,1.2,16.22,29.01,3.49,67.5,600,6.666666667,90
17.6,2.5,3.1,16.1,34.1,5.9,60,300,20,75
34.51,5.225,28.205,2.775,53.9876699,7.92815534,29.285,500,10,120
21.5,3.3,3.6,16.8,43.3,1.9,54.8,300,20,75
38.5,5.08,1.33,39.49,62.85,22.74,14.4,500,5.5,30
38.5,5.08,1.33,39.49,62.85,22.74,14.4,600,5.5,30
29.63,5.3,5.11,24.41,60.89,5.04,34.27,300,10,30
20.3,2.7,3.4,27,50.3,3.9,45.8,300,20,75
29.63,5.3,5.11,24.41,60.89,5.04,34.27,350,10,30
35.7,5.2,3.5,25.4,60.7,4.6,29.5,850,60,14.16666667
29.63,5.3,5.11,24.41,60.89,5.04,34.27,500,10,30
24.9,3.36,0.21,44.31,63.5,9.72,26.78,800,10,30
46.615,5.6925,32.59,2.7375,53.9876699,7.92815534,12.365,300,10,120
41.26,5.425,31.3,3.195,53.9876699,7.92815534,18.82,300,10,120
41.7,5.8,3,22.7,64.6,8.7,26,300,20,15
21.5,3.3,3.6,16.8,43.3,1.9,54.8,400,20,80
35.8975,5.1575,30.01,3.6525,53.9876699,7.92815534,25.275,300,10,120
9.1,0.86,1.5,10.2,18.8,2.8,78.4,500,20,85
12.18,5.82,1.26,23.06,27.12,16.65,56.23,900,35,25.71
29.63,5.3,5.11,24.41,60.89,5.04,34.27,450,10,30
29.63,5.3,5.11,24.41,60.89,5.04,34.27,400,10,30
9.1,0.86,1.5,10.2,18.8,2.8,78.4,400,20,80
24.67,4.65,4.51,18.6,51.44,5.68,46.62,700,15,40
47.07,3.91,2.29,44.4,70.4,6.21,11.84,400,25,25
38.5,5.08,1.33,39.49,62.85,22.74,14.4,400,5.5,30
9.1,0.86,1.5,10.2,18.8,2.8,78.4,300,20,75
17.6,2.5,3.1,16.1,34.1,5.9,60,700,20,95
37.78,5.47,38.79,2.13,77.69,6.485,36.94709524,500,15,120
35.8975,5.1575,30.01,3.6525,53.9876699,7.92815534,25.275,700,10,120
12.18,5.82,1.26,23.06,27.12,16.65,56.23,700,35,20
42.1,6.1,6.4,27.3,63.5,11.6,16.6,450,20,52.5
42.1,6.1,6.4,27.3,63.5,11.6,16.6,525,20,56.25
42.1,6.1,6.4,27.3,63.5,11.6,16.6,600,20,60
23.97,3.59,4.27,5.33,37.93,4.03,58.04,750,15,50
20.3,2.7,3.4,27,50.3,3.9,45.8,700,20,95
42.1,6.1,6.4,27.3,63.5,11.6,16.6,375,20,48.75
42.1,6.1,6.4,27.3,63.5,11.6,16.6,600,30,50
41.26,5.425,31.3,3.195,53.9876699,7.92815534,18.82,700,10,120
42.1,6.1,6.4,27.3,63.5,11.6,16.6,450,30,45
42.1,6.1,6.4,27.3,63.5,11.6,16.6,525,30,47.5
36.52,5.33,5.18,23.15,65.07,7.65,27.69,700,10,60
21.5,3.3,3.6,16.8,43.3,1.9,54.8,700,20,95
12.18,5.82,1.26,23.06,27.12,16.65,56.23,500,35,14.28
30.856,4.856,20.186,3.96,53.9876699,7.92815534,40.142,500,10,120
46.615,5.6925,32.59,2.7375,53.9876699,7.92815534,12.365,700,10,120
30.2,4.3,4.8,21.4,48.8,3.1,38.1,400,40,10
41.185,5.59,40.61,1.94,81.605,7.7225,36.94709524,700,15,120
17.6,2.5,3.1,16.1,34.1,5.9,60,600,20,90
42.1,6.1,6.4,27.3,63.5,11.6,16.6,300,10,60
42.1,6.1,6.4,27.3,63.5,11.6,16.6,375,10,67.5
42.1,6.1,6.4,27.3,63.5,11.6,16.6,450,10,75
42.1,6.1,6.4,27.3,63.5,11.6,16.6,525,10,82.5
30.54,2.2,1.44,8.05,23.66,19.36,56.98,850,20.73170732,41
30.54,2.2,1.44,8.05,23.66,19.36,56.98,650,15.85365854,41
42.1,6.1,6.4,27.3,63.5,11.6,16.6,600,10,90
30.54,2.2,1.44,8.05,23.66,19.36,56.98,450,10.97560976,41
42.1,6.1,6.4,27.3,63.5,11.6,16.6,300,20,45
23.97,3.59,4.27,3.53,37.93,4.03,58.04,450,10.97560976,41
23.97,3.59,4.27,3.53,37.93,4.03,58.04,650,15.85365854,41
0.1
0.1
0.1
0.1
0.105308219
0.107142857
0.11
0.11
0.11
0.110607434
0.111058601
0.113930267
0.12
0.12
0.13
0.13
0.130239521
0.132173192
0.133333333
0.141719217
0.158350515
0.158505155
0.16
0.16
0.161218092
0.163043478
0.169734513
0.17
0.17
0.174592617
0.179504814
0.18
0.182315668
0.188382412
0.197368421
0.2
0.2
0.219606579
0.22
0.220588235
0.224522293
0.24
0.241189427
0.245472837
0.25
0.250607198
0.263157895
0.265535313
0.27
0.270220588
0.271174377
0.28
0.28
0.29
0.296411856
0.3
0.3
0.3
0.3
0.3
0.315088757
0.318587106
0.32
0.321896
0.328737
0.33
0.331395349
0.36
0.380067568
0.39
0.39
0.390319258
0.395809611
0.41
0.42
0.428995253
0.434210526
0.44
0.46
0.47
0.477272727
0.5
0.5
0.513459
0.564705882
0.6
0.632675847
0.676392573
0.686063218
0.7
0.7
0.7
0.7
0.708661417
0.71
0.74
0.753336203
0.77
0.78
0.8
0.803571429
0.831709477
0.850354314
0.855880729
0.9
0.972177806
0.975
1.29
1.3
1.32
1.36
1.454914722
1.481535649
1.5
1.550840203
1.75
2.415956014
2.948008277
Inputs,,,,,,,,,,Outputs
Inputs,,,,,,,,,,Outputs
Ultimate analysis (sewage sludge),,Proximate analysis (sewage sludge),,,,,Operating conditions,,,Bio-char
C (wt%),H (wt%),N (wt%),O (wt%),Volatile matter (wt%),Fixed carbon (wt%),Ash (wt%),Temperature (°C),Heating rate (°C/min),Reaction time (min),OC ratio
38.3,5,3.4,37.3,72.1,11.9,16,500,10,80,0.1
41.7,5.8,3,22.7,64.6,8.7,26,800,20,40,0.1
38.3,5,3.4,37.3,72.1,11.9,16,400,10,70,0.1
35.7,5.2,3.5,25.4,60.7,4.6,29.5,650,60,10.83333333,0.105308219
20.3,2.7,3.4,27,50.3,3.9,45.8,600,20,90,0.107142857
28,3.4,4,10.3,38,7.9,46.8,575,28.75,20,0.11
23.97,3.59,4.27,5.33,37.93,4.03,58.04,650,13,50,0.11
41.7,5.8,3,22.7,64.6,8.7,26,700,20,35,0.11
34.375,5.35,26.97,2.32,73.775,5.2475,36.94709524,500,15,120,0.110607434
26.638,4.733,17.513,4.355,53.9876699,7.92815534,43.761,500,10,120,0.111058601
41.185,5.59,30.61,1.94,81.605,7.7225,36.94709524,600,15,120,0.113930267
38.3,5,3.4,37.3,72.1,11.9,16,300,10,60,0.12
35.5,5.5,5.1,27.2,63,12.1,24.9,700,10,60,0.12
30.2,4.3,4.8,21.4,48.8,3.1,38.1,350,35,10,0.13
41.7,5.8,3,22.7,64.6,8.7,26,900,20,45,0.13
38.1,5,5.8,15,64.8,5.3,29.9,450,11.25,40,0.130239521
37.78,5.47,28.79,2.13,77.69,6.485,36.94709524,700,15,120,0.132173192
35.7,5.2,3.5,25.4,60.7,4.6,29.5,450,5,90,0.133333333
41.185,5.59,30.61,1.94,81.605,7.7225,36.94709524,400,15,120,0.141719217
33.29,5.06,5.14,16.91,52.08,6.26,35.74,550,12.2,45,0.158350515
20.3,2.7,3.4,27,50.3,3.9,45.8,500,20,85,0.158505155
23.97,3.59,4.27,5.33,37.93,4.03,58.04,550,11,50,0.16
24.67,4.65,4.51,18.6,51.44,5.68,46.62,500,15,40,0.16
34.375,5.35,26.97,2.32,73.775,5.2475,36.94709524,700,15,120,0.161218092
35.7,5.2,3.5,25.4,60.7,4.6,29.5,450,60,7.5,0.163043478
35.8975,5.1575,20.01,3.6525,53.9876699,7.92815534,25.275,500,10,120,0.169734513
26.52,6.24,4.08,20.24,40.3,8.7,42,700,10,60,0.17
35.5,5.5,5.1,27.2,63,12.1,24.9,600,10,60,0.17
41.185,5.59,20.61,1.94,81.605,7.7225,36.94709524,500,15,120,0.174592617
41.26,5.425,31.3,3.195,53.9876699,7.92815534,18.82,500,10,120,0.179504814
22.3,3.6,2.8,16.6,41,5.7,53.3,500,10,60,0.18
46.615,5.6925,22.59,2.7375,53.9876699,7.92815534,12.365,500,10,120,0.182315668
37.78,5.47,28.79,2.13,77.69,6.485,36.94709524,400,15,120,0.188382412
9.1,0.86,1.5,10.2,18.8,2.8,78.4,700,20,95,0.197368421
52.3,8,6.7,32.3,62.3,6.5,31.2,1040,74.3,24,0.2
41.7,5.8,3,22.7,64.6,8.7,26,600,20,30,0.2
41.61,5.19,5.61,26.01,64.15,15.57,20.28,600,20,30,0.219606579
41.7,5.8,3,22.7,64.6,8.7,26,500,20,25,0.22
21.5,3.3,3.6,16.8,43.3,1.9,54.8,600,20,90,0.220588235
21.5,3.3,3.6,16.8,43.3,1.9,54.8,500,20,85,0.224522293
23.97,3.59,4.27,5.33,37.93,4.03,58.04,450,9,50,0.24
20.3,2.7,3.4,27,50.3,3.9,45.8,400,20,80,0.241189427
32.074,4.979,22.859,3.565,53.9876699,7.92815534,36.523,500,10,120,0.245472837
41.7,5.8,3,22.7,64.6,8.7,26,400,20,20,0.25
37.78,5.47,28.79,2.13,77.69,6.485,36.94709524,600,15,120,0.250607198
17.6,2.5,3.1,16.1,34.1,5.9,60,500,20,85,0.263157895
34.375,5.35,26.97,2.32,73.775,5.2475,36.94709524,400,15,120,0.265535313
9.1,0.86,1.5,10.2,18.8,2.8,78.4,600,20,90,0.27
17.6,2.5,3.1,16.1,34.1,5.9,60,400,20,80,0.270220588
33.292,5.102,25.532,3.17,53.9876699,7.92815534,32.904,500,10,120,0.271174377
26.52,6.24,4.08,20.24,40.3,8.7,42,400,10,60,0.28
35.5,5.5,5.1,27.2,63,12.1,24.9,500,10,60,0.28
24.67,4.65,4.51,18.6,51.44,5.68,46.62,300,15,40,0.29
34.375,5.35,26.97,2.32,73.775,5.2475,36.94709524,600,15,120,0.296411856
30.2,4.3,4.8,21.4,48.8,3.1,38.1,450,45,10,0.3
22.3,3.6,2.8,16.6,41,5.7,53.3,600,10,60,0.3
47.07,3.91,2.29,44.4,70.4,6.21,11.84,600,25,25,0.3
25.5,4.5,4.9,25.9,54.2,8.6,37.2,500,50,10,0.3
12.79,1.74,1.2,16.22,29.01,3.49,67.5,600,6.666666667,90,0.3
17.6,2.5,3.1,16.1,34.1,5.9,60,300,20,75,0.315088757
34.51,5.225,28.205,2.775,53.9876699,7.92815534,29.285,500,10,120,0.318587106
21.5,3.3,3.6,16.8,43.3,1.9,54.8,300,20,75,0.32
38.5,5.08,1.33,39.49,62.85,22.74,14.4,500,5.5,30,0.321896
38.5,5.08,1.33,39.49,62.85,22.74,14.4,600,5.5,30,0.328737
29.63,5.3,5.11,24.41,60.89,5.04,34.27,300,10,30,0.33
20.3,2.7,3.4,27,50.3,3.9,45.8,300,20,75,0.331395349
29.63,5.3,5.11,24.41,60.89,5.04,34.27,350,10,30,0.36
35.7,5.2,3.5,25.4,60.7,4.6,29.5,850,60,14.16666667,0.380067568
29.63,5.3,5.11,24.41,60.89,5.04,34.27,500,10,30,0.39
24.9,3.36,0.21,44.31,63.5,9.72,26.78,800,10,30,0.39
46.615,5.6925,22.59,2.7375,53.9876699,7.92815534,12.365,300,10,120,0.390319258
41.26,5.425,31.3,3.195,53.9876699,7.92815534,18.82,300,10,120,0.395809611
41.7,5.8,3,22.7,64.6,8.7,26,300,20,15,0.41
21.5,3.3,3.6,16.8,43.3,1.9,54.8,400,20,80,0.42
35.8975,5.1575,20.01,3.6525,53.9876699,7.92815534,25.275,300,10,120,0.428995253
9.1,0.86,1.5,10.2,18.8,2.8,78.4,500,20,85,0.434210526
12.18,5.82,1.26,23.06,27.12,16.65,56.23,900,35,25.71,0.44
29.63,5.3,5.11,24.41,60.89,5.04,34.27,450,10,30,0.46
29.63,5.3,5.11,24.41,60.89,5.04,34.27,400,10,30,0.47
9.1,0.86,1.5,10.2,18.8,2.8,78.4,400,20,80,0.477272727
24.67,4.65,4.51,18.6,51.44,5.68,46.62,700,15,40,0.5
47.07,3.91,2.29,44.4,70.4,6.21,11.84,400,25,25,0.5
38.5,5.08,1.33,39.49,62.85,22.74,14.4,400,5.5,30,0.513459
9.1,0.86,1.5,10.2,18.8,2.8,78.4,300,20,75,0.564705882
17.6,2.5,3.1,16.1,34.1,5.9,60,700,20,95,0.6
37.78,5.47,28.79,2.13,77.69,6.485,36.94709524,500,15,120,0.632675847
35.8975,5.1575,30.01,3.6525,53.9876699,7.92815534,25.275,700,10,120,0.676392573
12.18,5.82,1.26,23.06,27.12,16.65,56.23,700,35,20,0.686063218
42.1,6.1,6.4,27.3,63.5,11.6,16.6,450,20,52.5,0.7
42.1,6.1,6.4,27.3,63.5,11.6,16.6,525,20,56.25,0.7
42.1,6.1,6.4,27.3,63.5,11.6,16.6,600,20,60,0.7
23.97,3.59,4.27,5.33,37.93,4.03,58.04,750,15,50,0.7
20.3,2.7,3.4,27,50.3,3.9,45.8,700,20,95,0.708661417
42.1,6.1,6.4,27.3,63.5,11.6,16.6,375,20,48.75,0.71
42.1,6.1,6.4,27.3,63.5,11.6,16.6,600,30,50,0.74
41.26,5.425,31.3,3.195,53.9876699,7.92815534,18.82,700,10,120,0.753336203
42.1,6.1,6.4,27.3,63.5,11.6,16.6,450,30,45,0.77
42.1,6.1,6.4,27.3,63.5,11.6,16.6,525,30,47.5,0.78
36.52,5.33,5.18,23.15,65.07,7.65,27.69,700,10,60,0.8
21.5,3.3,3.6,16.8,43.3,1.9,54.8,700,20,95,0.803571429
12.18,5.82,1.26,23.06,27.12,16.65,56.23,500,35,14.28,0.831709477
30.856,4.856,20.186,3.96,53.9876699,7.92815534,40.142,500,10,120,0.850354314
46.615,5.6925,32.59,2.7375,53.9876699,7.92815534,12.365,700,10,120,0.855880729
30.2,4.3,4.8,21.4,48.8,3.1,38.1,400,40,10,0.9
41.185,5.59,30.61,1.94,81.605,7.7225,36.94709524,700,15,120,0.972177806
17.6,2.5,3.1,16.1,34.1,5.9,60,600,20,90,0.975
42.1,6.1,6.4,27.3,63.5,11.6,16.6,300,10,60,1.29
42.1,6.1,6.4,27.3,63.5,11.6,16.6,375,10,67.5,1.3
42.1,6.1,6.4,27.3,63.5,11.6,16.6,450,10,75,1.32
42.1,6.1,6.4,27.3,63.5,11.6,16.6,525,10,82.5,1.36
30.54,2.2,1.44,8.05,23.66,19.36,56.98,850,20.73170732,41,1.454914722
30.54,2.2,1.44,8.05,23.66,19.36,56.98,650,15.85365854,41,1.481535649
42.1,6.1,6.4,27.3,63.5,11.6,16.6,600,10,90,1.5
30.54,2.2,1.44,8.05,23.66,19.36,56.98,450,10.97560976,41,1.550840203
42.1,6.1,6.4,27.3,63.5,11.6,16.6,300,20,45,1.75
23.97,3.59,4.27,3.53,37.93,4.03,58.04,450,10.97560976,41,2.415956014
23.97,3.59,4.27,3.53,37.93,4.03,58.04,650,15.85365854,41,2.948008277
,,,,,,,,,,
,,,,,,,,,,
52.3,8,8.948663793,44.4,81.605,22.74,78.4,1040,74.3,120,
9.1,0.86,0.21,1.94,18.8,1.9,11.84,300,5,7.5,
,,,,,,,,,,
,,,,,,,,,,
9.1-52.3,0.86-8,0.21-8.95,1.94-44.4,18.8-81.605,1.9-22.74,11.84-78.4,300-800,5-74,,
{
{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# 文本分类实例"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step1 导入相关包"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments\n",
"from datasets import load_dataset"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step2 加载数据集"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dataset = load_dataset(\"csv\", data_files=\"./ChnSentiCorp_htl_all.csv\", split=\"train\")\n",
"dataset = dataset.filter(lambda x: x[\"review\"] is not None)\n",
"dataset"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step3 划分数据集"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"datasets = dataset.train_test_split(test_size=0.1)\n",
"datasets"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step4 数据集预处理"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import torch\n",
"\n",
"tokenizer = AutoTokenizer.from_pretrained(\"hfl/rbt3\")\n",
"\n",
"def process_function(examples):\n",
" tokenized_examples = tokenizer(examples[\"review\"], max_length=128, truncation=True)\n",
" tokenized_examples[\"labels\"] = examples[\"label\"]\n",
" return tokenized_examples\n",
"\n",
"tokenized_datasets = datasets.map(process_function, batched=True, remove_columns=datasets[\"train\"].column_names)\n",
"tokenized_datasets"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step5 创建模型"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def model_init():\n",
" model = AutoModelForSequenceClassification.from_pretrained(\"hfl/rbt3\")\n",
" return model"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step6 创建评估函数"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import evaluate\n",
"\n",
"acc_metric = evaluate.load(\"accuracy\")\n",
"f1_metirc = evaluate.load(\"f1\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def eval_metric(eval_predict):\n",
" predictions, labels = eval_predict\n",
" predictions = predictions.argmax(axis=-1)\n",
" acc = acc_metric.compute(predictions=predictions, references=labels)\n",
" f1 = f1_metirc.compute(predictions=predictions, references=labels)\n",
" acc.update(f1)\n",
" return acc"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step7 创建TrainingArguments"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"train_args = TrainingArguments(output_dir=\"./checkpoints\", # 输出文件夹\n",
" per_device_train_batch_size=64, # 训练时的batch_size\n",
" per_device_eval_batch_size=128, # 验证时的batch_size\n",
" logging_steps=500, # log 打印的频率\n",
" evaluation_strategy=\"epoch\", # 评估策略\n",
" save_strategy=\"epoch\", # 保存策略\n",
" save_total_limit=3, # 最大保存数\n",
" learning_rate=2e-5, # 学习率\n",
" weight_decay=0.01, # weight_decay\n",
" metric_for_best_model=\"f1\", # 设定评估指标\n",
" load_best_model_at_end=True) # 训练完成后加载最优模型"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step8 创建Trainer"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from transformers import DataCollatorWithPadding\n",
"trainer = Trainer(model_init=model_init, \n",
" args=train_args, \n",
" train_dataset=tokenized_datasets[\"train\"], \n",
" eval_dataset=tokenized_datasets[\"test\"], \n",
" data_collator=DataCollatorWithPadding(tokenizer=tokenizer),\n",
" compute_metrics=eval_metric)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step9 模型训练"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# trainer.train()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step9 模型训练(自动搜索)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def default_hp_space_optuna(trial):\n",
" return {\n",
" \"learning_rate\": trial.suggest_float(\"learning_rate\", 1e-6, 1e-4),\n",
" \"num_train_epochs\": trial.suggest_int(\"num_train_epochs\", 1, 5),\n",
" \"seed\": trial.suggest_int(\"seed\", 1, 40),\n",
" \"per_device_train_batch_size\": trial.suggest_categorical(\"per_device_train_batch_size\", [4, 8, 16, 32, 64]),\n",
" \"optim\": trial.suggest_categorical(\"optim\", [\"sgd\", \"adamw_hf\"]),\n",
" }\n",
"\n",
"trainer.hyperparameter_search(hp_space=default_hp_space_optuna, compute_objective=lambda x: x[\"eval_f1\"], direction=\"maximize\", n_trials=10)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "transformers",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.16"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-12-05T14:10:02.032031Z",
"start_time": "2024-12-05T14:09:26.615762Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"训练集样本数: 77\n",
"验证集样本数: 20\n",
"测试集样本数: 20\n",
"Fitting 5 folds for each of 270 candidates, totalling 1350 fits\n",
"Best parameters found: {'bootstrap': False, 'max_features': 'sqrt', 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 100}\n",
"训练集 平均误差率为: 1.2754501965970513e-13 R2为: 1.0\n",
"验证集 平均误差率为: 81.74052460662605 R2为: 0.5743786212193724\n",
"测试集 平均误差率为: 63.459346427509914 R2为: 0.2492545962759135\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.700000 0.700000 1.903239e-13\n",
"1 1.360000 1.360000 1.632681e-14\n",
"2 0.434211 0.434211 1.406282e-13\n",
"3 0.270000 0.270000 1.439178e-13\n",
"4 0.800000 0.800000 1.942890e-13\n",
".. ... ... ...\n",
"72 1.550840 1.550840 2.577186e-13\n",
"73 0.315089 0.315089 2.290291e-13\n",
"74 0.420000 0.420000 2.379049e-13\n",
"75 1.290000 1.290000 2.237659e-13\n",
"76 0.700000 0.700000 1.903239e-13\n",
"\n",
"[77 rows x 3 columns]\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.700000 0.384019 45.140109\n",
"1 0.169735 0.381743 124.905791\n",
"2 0.130000 0.143376 10.288865\n",
"3 1.454915 1.453441 0.101268\n",
"4 0.161218 0.183198 13.633632\n",
"5 0.686063 0.832028 21.275638\n",
"6 0.300000 0.849481 183.160380\n",
"7 0.770000 1.154617 49.950272\n",
"8 1.481536 1.514061 2.195402\n",
"9 0.390000 0.382865 1.829540\n",
"10 0.300000 0.189459 36.847012\n",
"11 0.179505 0.339052 88.881954\n",
"12 0.133333 0.316901 137.675474\n",
"13 0.224522 0.376518 67.697221\n",
"14 0.130000 0.894200 587.846154\n",
"15 0.130240 0.345293 165.121638\n",
"16 0.564706 0.464691 17.710985\n",
"17 0.500000 0.374682 25.063608\n",
"18 0.158505 0.231296 45.923637\n",
"19 0.780000 0.705417 9.561911\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.250607 0.139298 44.415797\n",
"1 0.107143 0.339530 216.895076\n",
"2 0.296412 0.116847 60.579472\n",
"3 0.245473 0.230064 6.277053\n",
"4 0.113930 0.173835 52.579898\n",
"5 0.632676 0.161976 74.398320\n",
"6 0.410000 0.272436 33.552115\n",
"7 0.740000 0.704717 4.767960\n",
"8 0.219607 0.423632 92.904890\n",
"9 0.120000 0.152948 27.456707\n",
"10 0.240000 0.657683 174.034492\n",
"11 0.170000 0.334165 96.567408\n",
"12 0.753336 0.633392 15.921783\n",
"13 0.972178 0.168735 82.643621\n",
"14 0.141719 0.184504 30.189690\n",
"15 0.100000 0.121528 21.527884\n",
"16 0.321896 0.487598 51.476850\n",
"17 1.500000 1.254400 16.373333\n",
"18 0.440000 0.820681 86.518346\n",
"19 0.850354 0.169167 80.106234\n",
"33.53351902961731\n"
]
}
],
"source": [
"# 导入所需的库\n",
"import csv\n",
"import time\n",
"\n",
"import joblib\n",
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.metrics import mean_squared_error, r2_score\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"import warnings\n",
"from sklearn.model_selection import GridSearchCV\n",
"import time\n",
"# 忽略警告信息\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"# 数据加载函数\n",
"def load_data(file_path):\n",
" \"\"\"从CSV文件中加载数据,并转换为浮点数列表\"\"\"\n",
" data = []\n",
" with open(file_path, 'r', encoding='utf-8-sig') as file:\n",
" reader = csv.reader(file)\n",
" for line in reader:\n",
" data.append(line)\n",
" return np.array(data, dtype='float64').tolist()\n",
"\n",
"# 误差率计算函数\n",
"def calculate_error_rate(predictions, labels):\n",
" \"\"\"计算预测值与真实值之间的误差率(百分比)\"\"\"\n",
" return [np.abs((p - l) / l) * 100 if l != 0 else 0 for p, l in zip(predictions, labels)]\n",
"\n",
"# 自定义评分函数:均方根误差\n",
"def custom_rmse(y_true, y_pred):\n",
" \"\"\"计算均方根误差\"\"\"\n",
" mse = mean_squared_error(y_true, y_pred)\n",
" rmse = mse ** 0.5\n",
" return rmse\n",
"\n",
"# 打印预测结果和性能指标\n",
"def print_results(model, cross_data, test_data, train_data, val_labels, test_labels, train_labels):\n",
" \"\"\"打印训练集、验证集和测试集的预测结果及性能指标\"\"\"\n",
" # 预测\n",
" label_predict_cross = model.predict(cross_data)\n",
" label_predict_test = model.predict(test_data)\n",
" label_predict_train = model.predict(train_data)\n",
"\n",
" # 构建DataFrame存储真实值和预测值\n",
" df_cross = pd.DataFrame({'真实值': [i[0] for i in val_labels], 'rf_预测': label_predict_cross})\n",
" df_test = pd.DataFrame({'真实值': [i[0] for i in test_labels], 'rf_预测': label_predict_test})\n",
" df_train = pd.DataFrame({'真实值': [i[0] for i in train_labels], 'rf_预测': label_predict_train})\n",
"\n",
" # 计算误差率\n",
" df_cross['rf_误差率'] = calculate_error_rate(df_cross['rf_预测'], df_cross['真实值'])\n",
" df_test['rf_误差率'] = calculate_error_rate(df_test['rf_预测'], df_test['真实值'])\n",
" df_train['rf_误差率'] = calculate_error_rate(df_train['rf_预测'], df_train['真实值'])\n",
"\n",
" # 计算R²分数\n",
" r2_cross = r2_score(df_cross['真实值'], df_cross['rf_预测'])\n",
" r2_test = r2_score(df_test['真实值'], df_test['rf_预测'])\n",
" r2_train = r2_score(df_train['真实值'], df_train['rf_预测'])\n",
"\n",
" # 打印结果\n",
" print(f\"训练集 平均误差率为: {df_train['rf_误差率'].mean()} R2为: {r2_train}\")\n",
" print(f\"验证集 平均误差率为: {df_cross['rf_误差率'].mean()} R2为: {r2_cross}\")\n",
" print(f\"测试集 平均误差率为: {df_test['rf_误差率'].mean()} R2为: {r2_test}\")\n",
"\n",
" # 打印DataFrame\n",
" print(df_train)\n",
" print(df_cross)\n",
" print(df_test)\n",
"\n",
"# 主函数\n",
"def main():\n",
" # 文件路径\n",
" s=time.time()\n",
" input_file = r'E:\\点头第五期课程\\模型参数优化\\OC\\OC ratio-inputs.csv'\n",
" output_file = r'E:\\点头第五期课程\\模型参数优化\\OC\\OC ratio-outputs.csv'\n",
"\n",
" # 加载数据\n",
" pattern = load_data(input_file)\n",
" label = load_data(output_file)\n",
"\n",
" # 划分数据集\n",
" temp_data, test_data, temp_labels, test_labels = train_test_split(\n",
" pattern, label, test_size=0.17, random_state=42)\n",
" train_data, val_data, train_labels, val_labels = train_test_split(\n",
" temp_data, temp_labels, test_size=0.2, random_state=42)\n",
"\n",
" # 输出数据集大小\n",
" print(\"训练集样本数:\", len(train_data))\n",
" print(\"验证集样本数:\", len(val_data))\n",
" print(\"测试集样本数:\", len(test_data))\n",
"\n",
" # 数据归一化\n",
" scaler = MinMaxScaler()\n",
" normalized_data = scaler.fit_transform(train_data)\n",
" normalized_cross_data = scaler.transform(val_data)\n",
" normalized_test_data = scaler.transform(test_data)\n",
"\n",
" # 定义参数网格\n",
" param_grid = {\n",
" 'n_estimators': [100, 200, 300,400,500],\n",
" 'max_features': ['sqrt', 'log2',None],\n",
" 'min_samples_split': [2, 5, 10],\n",
" 'min_samples_leaf': [1, 2, 4],\n",
" 'bootstrap': [True, False]\n",
" }\n",
"\n",
" # 创建随机森林模型实例\n",
" rf_model = RandomForestRegressor(random_state=42)\n",
"\n",
" # 使用GridSearchCV进行网格搜索\n",
" grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error', n_jobs=-1, verbose=2)\n",
" \n",
" # 训练模型并执行网格搜索\n",
" grid_search.fit(normalized_data, train_labels)\n",
"\n",
" # 输出最佳参数和最佳得分\n",
" print(\"Best parameters found: \", grid_search.best_params_)\n",
" # print(\"Best cross-validation score: {:.2f}\".format(grid_search.best_score_))\n",
"\n",
" # 使用最佳参数创建最终模型\n",
" best_rf_model = grid_search.best_estimator_\n",
" # 打印预测结果和性能指标\n",
" print_results(best_rf_model, normalized_cross_data, normalized_test_data, normalized_data, val_labels, test_labels, train_labels)\n",
" e=time.time()\n",
" print(e-s)\n",
"if __name__ == \"__main__\":\n",
" main()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
{
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-12-05T14:08:22.213978Z",
"start_time": "2024-12-05T14:08:04.149973Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"训练集样本数: 77\n",
"验证集样本数: 20\n",
"测试集样本数: 20\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Fitting 5 folds for each of 1 candidates, totalling 5 fits\n",
"Best parameters found: OrderedDict([('bootstrap', True), ('max_features', 'log2'), ('min_samples_leaf', 5), ('min_samples_split', 8), ('n_estimators', 493)])\n",
"训练集 平均误差率为: 77.53119267362298 R2为: 0.38814354094871295\n",
"验证集 平均误差率为: 81.32371989192606 R2为: 0.47512928208216354\n",
"测试集 平均误差率为: 111.95118725946797 R2为: 0.10900854268492577\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.700000 0.884169 26.309846\n",
"1 1.360000 0.885138 34.916355\n",
"2 0.434211 0.594416 36.895694\n",
"3 0.270000 0.611973 126.656711\n",
"4 0.800000 0.419645 47.544419\n",
".. ... ... ...\n",
"72 1.550840 0.788595 49.150450\n",
"73 0.315089 0.581139 84.436585\n",
"74 0.420000 0.444108 5.740022\n",
"75 1.290000 0.929957 27.910300\n",
"76 0.700000 0.912329 30.332691\n",
"\n",
"[77 rows x 3 columns]\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.700000 0.786603 12.371850\n",
"1 0.169735 0.399930 135.621199\n",
"2 0.130000 0.259675 99.750272\n",
"3 1.454915 0.735751 49.429934\n",
"4 0.161218 0.320441 98.762551\n",
"5 0.686063 0.716669 4.461087\n",
"6 0.300000 0.614363 104.787634\n",
"7 0.770000 0.916765 19.060339\n",
"8 1.481536 0.747330 49.557075\n",
"9 0.390000 0.362478 7.056975\n",
"10 0.300000 0.366718 22.239286\n",
"11 0.179505 0.416753 132.168121\n",
"12 0.133333 0.342350 156.762571\n",
"13 0.224522 0.429417 91.257902\n",
"14 0.130000 0.482574 271.211130\n",
"15 0.130240 0.344333 164.384274\n",
"16 0.564706 0.621899 10.128000\n",
"17 0.500000 0.311181 37.763884\n",
"18 0.158505 0.391424 146.947318\n",
"19 0.780000 0.879473 12.752995\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.250607 0.282672 12.794991\n",
"1 0.107143 0.407840 280.650773\n",
"2 0.296412 0.285887 3.550611\n",
"3 0.245473 0.376188 53.250158\n",
"4 0.113930 0.284760 149.942530\n",
"5 0.632676 0.271753 57.047038\n",
"6 0.410000 0.271471 33.787588\n",
"7 0.740000 0.879425 18.841244\n",
"8 0.219607 0.426237 94.091168\n",
"9 0.120000 0.494396 311.996997\n",
"10 0.240000 0.805267 235.527847\n",
"11 0.170000 0.508306 199.003644\n",
"12 0.753336 0.463927 38.417058\n",
"13 0.972178 0.317351 67.356738\n",
"14 0.141719 0.303130 113.894704\n",
"15 0.100000 0.457592 357.592091\n",
"16 0.321896 0.482197 49.799046\n",
"17 1.500000 0.885779 40.948074\n",
"18 0.440000 0.715868 62.697166\n",
"19 0.850354 0.358558 57.834280\n",
"16.043532609939575\n"
]
}
],
"source": [
"# 导入所需的库\n",
"import csv\n",
"import joblib\n",
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.metrics import mean_squared_error, r2_score\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"import warnings\n",
"import time\n",
"from skopt import BayesSearchCV\n",
"from skopt.space import Real, Integer, Categorical\n",
"# 忽略警告信息\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"# 数据加载函数\n",
"def load_data(file_path):\n",
" \"\"\"从CSV文件中加载数据,并转换为浮点数列表\"\"\"\n",
" data = []\n",
" with open(file_path, 'r', encoding='utf-8-sig') as file:\n",
" reader = csv.reader(file)\n",
" for line in reader:\n",
" data.append(line)\n",
" return np.array(data, dtype='float64').tolist()\n",
"\n",
"# 误差率计算函数\n",
"def calculate_error_rate(predictions, labels):\n",
" \"\"\"计算预测值与真实值之间的误差率(百分比)\"\"\"\n",
" return [np.abs((p - l) / l) * 100 if l != 0 else 0 for p, l in zip(predictions, labels)]\n",
"\n",
"# 自定义评分函数:均方根误差\n",
"def custom_rmse(y_true, y_pred):\n",
" \"\"\"计算均方根误差\"\"\"\n",
" mse = mean_squared_error(y_true, y_pred)\n",
" rmse = mse ** 0.5\n",
" return rmse\n",
"\n",
"# 打印预测结果和性能指标\n",
"def print_results(model, cross_data, test_data, train_data, val_labels, test_labels, train_labels):\n",
" \"\"\"打印训练集、验证集和测试集的预测结果及性能指标\"\"\"\n",
" # 预测\n",
" label_predict_cross = model.predict(cross_data)\n",
" label_predict_test = model.predict(test_data)\n",
" label_predict_train = model.predict(train_data)\n",
"\n",
" # 构建DataFrame存储真实值和预测值\n",
" df_cross = pd.DataFrame({'真实值': [i[0] for i in val_labels], 'rf_预测': label_predict_cross})\n",
" df_test = pd.DataFrame({'真实值': [i[0] for i in test_labels], 'rf_预测': label_predict_test})\n",
" df_train = pd.DataFrame({'真实值': [i[0] for i in train_labels], 'rf_预测': label_predict_train})\n",
"\n",
" # 计算误差率\n",
" df_cross['rf_误差率'] = calculate_error_rate(df_cross['rf_预测'], df_cross['真实值'])\n",
" df_test['rf_误差率'] = calculate_error_rate(df_test['rf_预测'], df_test['真实值'])\n",
" df_train['rf_误差率'] = calculate_error_rate(df_train['rf_预测'], df_train['真实值'])\n",
"\n",
" # 计算R²分数\n",
" r2_cross = r2_score(df_cross['真实值'], df_cross['rf_预测'])\n",
" r2_test = r2_score(df_test['真实值'], df_test['rf_预测'])\n",
" r2_train = r2_score(df_train['真实值'], df_train['rf_预测'])\n",
"\n",
" # 打印结果\n",
" print(f\"训练集 平均误差率为: {df_train['rf_误差率'].mean()} R2为: {r2_train}\")\n",
" print(f\"验证集 平均误差率为: {df_cross['rf_误差率'].mean()} R2为: {r2_cross}\")\n",
" print(f\"测试集 平均误差率为: {df_test['rf_误差率'].mean()} R2为: {r2_test}\")\n",
"\n",
" # 打印DataFrame\n",
" print(df_train)\n",
" print(df_cross)\n",
" print(df_test)\n",
"\n",
"# 主函数\n",
"def main():\n",
" s=time.time()\n",
" # 文件路径\n",
" input_file = r'E:\\点头第五期课程\\模型参数优化\\OC\\OC ratio-inputs.csv'\n",
" output_file = r'E:\\点头第五期课程\\模型参数优化\\OC\\OC ratio-outputs.csv'\n",
"\n",
" # 加载数据\n",
" pattern = load_data(input_file)\n",
" label = load_data(output_file)\n",
"\n",
" # 划分数据集\n",
" temp_data, test_data, temp_labels, test_labels = train_test_split(\n",
" pattern, label, test_size=0.17, random_state=42)\n",
" train_data, val_data, train_labels, val_labels = train_test_split(\n",
" temp_data, temp_labels, test_size=0.2, random_state=42)\n",
"\n",
" # 输出数据集大小\n",
" print(\"训练集样本数:\", len(train_data))\n",
" print(\"验证集样本数:\", len(val_data))\n",
" print(\"测试集样本数:\", len(test_data))\n",
"\n",
" # 数据归一化\n",
" scaler = MinMaxScaler()\n",
" normalized_data = scaler.fit_transform(train_data)\n",
" normalized_cross_data = scaler.transform(val_data)\n",
" normalized_test_data = scaler.transform(test_data)\n",
"\n",
" # 定义参数空间\n",
" param_space = {\n",
" 'n_estimators': Integer(100, 500), # 树的数量\n",
" 'max_features': Categorical(['sqrt', 'log2',None]),\n",
" 'min_samples_split': Integer(2, 11),\n",
" 'min_samples_leaf': Integer(1, 5),\n",
" 'bootstrap': Categorical([True, False])\n",
" }\n",
"\n",
" # 创建随机森林模型实例\n",
" rf_model = RandomForestRegressor(random_state=42)\n",
"\n",
" # 使用BayesSearchCV进行贝叶斯优化\n",
" bayes_search = BayesSearchCV(\n",
" estimator=rf_model,\n",
" search_spaces=param_space,\n",
" n_iter=20, # 迭代次数\n",
" cv=5, # 五折交叉验证\n",
" scoring='neg_mean_squared_error',\n",
" n_jobs=-1, # 使用所有可用的核心\n",
" verbose=2, # 打印详细信息\n",
" random_state=42 # 确保结果可复现\n",
" )\n",
"\n",
" # 训练模型并执行贝叶斯优化\n",
" bayes_search.fit(normalized_data, train_labels)\n",
"\n",
" # 输出最佳参数和最佳得分\n",
" print(\"Best parameters found: \", bayes_search.best_params_)\n",
" # print(\"Best cross-validation score: {:.2f}\".format(bayes_search.best_score_))\n",
"\n",
" # 使用最佳参数创建最终模型\n",
" best_rf_model = bayes_search.best_estimator_\n",
"\n",
" # 打印预测结果和性能指标\n",
" print_results(best_rf_model, normalized_cross_data, normalized_test_data, normalized_data, val_labels, test_labels, train_labels)\n",
" e=time.time()\n",
" print(e-s)\n",
"if __name__ == \"__main__\":\n",
" main()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
{
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-12-05T14:10:03.661876Z",
"start_time": "2024-12-05T14:09:40.330750Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"训练集样本数: 77\n",
"验证集样本数: 20\n",
"测试集样本数: 20\n",
"Fitting 5 folds for each of 10 candidates, totalling 50 fits\n",
"Best parameters found: {'bootstrap': True, 'max_features': 'sqrt', 'min_samples_leaf': 3, 'min_samples_split': 9, 'n_estimators': 288}\n",
"训练集 平均误差率为: 70.67592788833923 R2为: 0.5180963229443235\n",
"验证集 平均误差率为: 79.83781270986681 R2为: 0.5767077381613671\n",
"测试集 平均误差率为: 106.22934209295856 R2为: 0.07305682307731742\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.700000 0.920069 31.438479\n",
"1 1.360000 0.956882 29.641055\n",
"2 0.434211 0.499291 14.988126\n",
"3 0.270000 0.519835 92.531383\n",
"4 0.800000 0.450684 43.664517\n",
".. ... ... ...\n",
"72 1.550840 0.958987 38.163377\n",
"73 0.315089 0.514595 63.317513\n",
"74 0.420000 0.403999 3.809841\n",
"75 1.290000 1.001405 22.371698\n",
"76 0.700000 0.959099 37.014089\n",
"\n",
"[77 rows x 3 columns]\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.700000 0.895178 27.882609\n",
"1 0.169735 0.389751 129.624018\n",
"2 0.130000 0.273356 110.273906\n",
"3 1.454915 0.866331 40.454848\n",
"4 0.161218 0.328845 103.975032\n",
"5 0.686063 0.753261 9.794730\n",
"6 0.300000 0.618789 106.263098\n",
"7 0.770000 0.978986 27.141046\n",
"8 1.481536 0.895964 39.524670\n",
"9 0.390000 0.362949 6.936210\n",
"10 0.300000 0.344163 14.720926\n",
"11 0.179505 0.411381 129.175378\n",
"12 0.133333 0.338644 153.983317\n",
"13 0.224522 0.389204 73.347707\n",
"14 0.130000 0.488553 275.809710\n",
"15 0.130240 0.336868 158.652387\n",
"16 0.564706 0.525422 6.956602\n",
"17 0.500000 0.319249 36.150150\n",
"18 0.158505 0.356904 125.168832\n",
"19 0.780000 0.943184 20.921080\n",
" 真实值 rf_预测 rf_误差率\n",
"0 0.250607 0.254663 1.618358\n",
"1 0.107143 0.381388 255.962064\n",
"2 0.296412 0.281428 5.054913\n",
"3 0.245473 0.354115 44.258263\n",
"4 0.113930 0.256730 125.339815\n",
"5 0.632676 0.240955 61.914967\n",
"6 0.410000 0.260137 36.551946\n",
"7 0.740000 0.920349 24.371516\n",
"8 0.219607 0.437816 99.363807\n",
"9 0.120000 0.441586 267.987946\n",
"10 0.240000 0.924158 285.065920\n",
"11 0.170000 0.517921 204.659134\n",
"12 0.753336 0.472953 37.218925\n",
"13 0.972178 0.300051 69.136150\n",
"14 0.141719 0.267084 88.460127\n",
"15 0.100000 0.405287 305.287252\n",
"16 0.321896 0.455695 41.565796\n",
"17 1.500000 0.942020 37.198637\n",
"18 0.440000 0.753261 71.195740\n",
"19 0.850354 0.319941 62.375565\n",
"18.86562991142273\n"
]
}
],
"source": [
"# 导入所需的库\n",
"import csv\n",
"import joblib\n",
"import numpy as np\n",
"import pandas as pd\n",
"from sklearn.metrics import mean_squared_error, r2_score\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"import warnings\n",
"import time\n",
"from sklearn.model_selection import RandomizedSearchCV\n",
"from scipy.stats import randint as sp_randint\n",
"# 忽略警告信息\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"# 数据加载函数\n",
"def load_data(file_path):\n",
" \"\"\"从CSV文件中加载数据,并转换为浮点数列表\"\"\"\n",
" data = []\n",
" with open(file_path, 'r', encoding='utf-8-sig') as file:\n",
" reader = csv.reader(file)\n",
" for line in reader:\n",
" data.append(line)\n",
" return np.array(data, dtype='float64').tolist()\n",
"\n",
"# 误差率计算函数\n",
"def calculate_error_rate(predictions, labels):\n",
" \"\"\"计算预测值与真实值之间的误差率(百分比)\"\"\"\n",
" return [np.abs((p - l) / l) * 100 if l != 0 else 0 for p, l in zip(predictions, labels)]\n",
"\n",
"# 自定义评分函数:均方根误差\n",
"def custom_rmse(y_true, y_pred):\n",
" \"\"\"计算均方根误差\"\"\"\n",
" mse = mean_squared_error(y_true, y_pred)\n",
" rmse = mse ** 0.5\n",
" return rmse\n",
"\n",
"# 打印预测结果和性能指标\n",
"def print_results(model, cross_data, test_data, train_data, val_labels, test_labels, train_labels):\n",
" \"\"\"打印训练集、验证集和测试集的预测结果及性能指标\"\"\"\n",
" # 预测\n",
" label_predict_cross = model.predict(cross_data)\n",
" label_predict_test = model.predict(test_data)\n",
" label_predict_train = model.predict(train_data)\n",
"\n",
" # 构建DataFrame存储真实值和预测值\n",
" df_cross = pd.DataFrame({'真实值': [i[0] for i in val_labels], 'rf_预测': label_predict_cross})\n",
" df_test = pd.DataFrame({'真实值': [i[0] for i in test_labels], 'rf_预测': label_predict_test})\n",
" df_train = pd.DataFrame({'真实值': [i[0] for i in train_labels], 'rf_预测': label_predict_train})\n",
"\n",
" # 计算误差率\n",
" df_cross['rf_误差率'] = calculate_error_rate(df_cross['rf_预测'], df_cross['真实值'])\n",
" df_test['rf_误差率'] = calculate_error_rate(df_test['rf_预测'], df_test['真实值'])\n",
" df_train['rf_误差率'] = calculate_error_rate(df_train['rf_预测'], df_train['真实值'])\n",
"\n",
" # 计算R²分数\n",
" r2_cross = r2_score(df_cross['真实值'], df_cross['rf_预测'])\n",
" r2_test = r2_score(df_test['真实值'], df_test['rf_预测'])\n",
" r2_train = r2_score(df_train['真实值'], df_train['rf_预测'])\n",
"\n",
" # 打印结果\n",
" print(f\"训练集 平均误差率为: {df_train['rf_误差率'].mean()} R2为: {r2_train}\")\n",
" print(f\"验证集 平均误差率为: {df_cross['rf_误差率'].mean()} R2为: {r2_cross}\")\n",
" print(f\"测试集 平均误差率为: {df_test['rf_误差率'].mean()} R2为: {r2_test}\")\n",
"\n",
" # 打印DataFrame\n",
" print(df_train)\n",
" print(df_cross)\n",
" print(df_test)\n",
"\n",
"# 主函数\n",
"def main():\n",
" s=time.time()\n",
" # 文件路径\n",
" input_file = r'E:\\点头第五期课程\\模型参数优化\\OC\\OC ratio-inputs.csv'\n",
" output_file = r'E:\\点头第五期课程\\模型参数优化\\OC\\OC ratio-outputs.csv'\n",
"\n",
" # 加载数据\n",
" pattern = load_data(input_file)\n",
" label = load_data(output_file)\n",
"\n",
" # 划分数据集\n",
" temp_data, test_data, temp_labels, test_labels = train_test_split(\n",
" pattern, label, test_size=0.17, random_state=42)\n",
" train_data, val_data, train_labels, val_labels = train_test_split(\n",
" temp_data, temp_labels, test_size=0.2, random_state=42)\n",
"\n",
" # 输出数据集大小\n",
" print(\"训练集样本数:\", len(train_data))\n",
" print(\"验证集样本数:\", len(val_data))\n",
" print(\"测试集样本数:\", len(test_data))\n",
"\n",
" # 数据归一化\n",
" scaler = MinMaxScaler()\n",
" normalized_data = scaler.fit_transform(train_data)\n",
" normalized_cross_data = scaler.transform(val_data)\n",
" normalized_test_data = scaler.transform(test_data)\n",
"\n",
"# 定义参数空间\n",
" param_dist = {\n",
" 'n_estimators': sp_randint(100, 500), # 树的数量\n",
" 'max_features': ['sqrt', 'log2',None],\n",
" 'min_samples_split': sp_randint(2, 11),\n",
" 'min_samples_leaf': sp_randint(1, 5),\n",
" 'bootstrap': [True, False]\n",
" }\n",
"\n",
" # 创建随机森林模型实例\n",
" rf_model = RandomForestRegressor(random_state=42)\n",
"\n",
" # 使用RandomizedSearchCV进行随机搜索\n",
" random_search = RandomizedSearchCV(\n",
" estimator=rf_model,\n",
" param_distributions=param_dist,\n",
" n_iter=10, # 随机采样次数\n",
" cv=5, # 五折交叉验证\n",
" scoring='neg_mean_squared_error',\n",
" n_jobs=-1, # 使用所有可用的核心\n",
" verbose=2, # 打印详细信息\n",
" random_state=42 # 确保结果可复现\n",
" )\n",
"\n",
" # 训练模型并执行随机搜索\n",
" random_search.fit(normalized_data, train_labels)\n",
"\n",
" # 输出最佳参数和最佳得分\n",
" print(\"Best parameters found: \", random_search.best_params_)\n",
" # print(\"Best cross-validation score: {:.2f}\".format(random_search.best_score_))\n",
"\n",
" # 使用最佳参数创建最终模型\n",
" best_rf_model = random_search.best_estimator_\n",
" # 打印预测结果和性能指标\n",
" print_results(best_rf_model, normalized_cross_data, normalized_test_data, normalized_data, val_labels, test_labels, train_labels)\n",
" e=time.time()\n",
" print(e-s)\n",
"if __name__ == \"__main__\":\n",
" main()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
This source diff could not be displayed because it is too large. You can view the blob instead.
# 图像模型优化补充资料
# 图像模型优化补充资料
## 下载链接
请通过以下链接下载补充资料:
- **链接**: [https://pan.baidu.com/s/1EQuRDiDl57kFgGYLNtTh8w?pwd=q2cj](https://pan.baidu.com/s/1EQuRDiDl57kFgGYLNtTh8w?pwd=q2cj)
- **提取码**: q2cj
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment