帮我写一个GA优化svm参数的python代码
时间: 2024-05-15 11:15:23 浏览: 21
以下是一个基本的GA优化SVM参数的Python代码:
```python
import numpy as np
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import random
# 加载数据
X = np.load('X.npy')
y = np.load('y.npy')
# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义SVM模型
def svm_model(C, gamma):
model = svm.SVC(C=C, gamma=gamma)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
return accuracy_score(y_test, y_pred)
# 定义GA参数
pop_size = 20 # 种群大小
num_generations = 10 # 迭代次数
mutation_rate = 0.1 # 变异率
# 定义参数范围
C_range = (0.1, 10)
gamma_range = (0.0001, 1)
# 初始化种群
population = []
for i in range(pop_size):
C = random.uniform(C_range[0], C_range[1])
gamma = random.uniform(gamma_range[0], gamma_range[1])
population.append((C, gamma))
# 迭代GA
for generation in range(num_generations):
# 计算适应度
fitness = []
for individual in population:
fitness.append(svm_model(individual[0], individual[1]))
# 选择
selected = []
for i in range(int(pop_size / 2)):
ind1 = random.choices(population, weights=fitness)[0]
ind2 = random.choices(population, weights=fitness)[0]
selected.append((ind1, ind2))
# 交叉
offspring = []
for parents in selected:
C1, gamma1 = parents[0]
C2, gamma2 = parents[1]
offspring1 = (C1, gamma2)
offspring2 = (C2, gamma1)
offspring.append(offspring1)
offspring.append(offspring2)
# 变异
for i in range(pop_size):
if random.random() < mutation_rate:
individual = offspring[i]
new_C = individual[0] + random.uniform(-1, 1)
new_C = max(C_range[0], min(C_range[1], new_C))
new_gamma = individual[1] + random.uniform(-1, 1)
new_gamma = max(gamma_range[0], min(gamma_range[1], new_gamma))
offspring[i] = (new_C, new_gamma)
# 更新种群
population = offspring
# 输出最优解
best_individual = max(population, key=lambda ind: svm_model(ind[0], ind[1]))
print('Best individual: C={}, gamma={}, accuracy={}'.format(best_individual[0], best_individual[1], svm_model(best_individual[0], best_individual[1])))
```