#python #generics #genetic-algorithm #feature-selection #keyerror
Вопрос:
код:
import numpy as np
import pandas as pd
import math
import target as target
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
dataset = pd.read_csv('Tehran_hies98.csv')
to_drop = ['Address', 'weight', 'WH', 'inc3', 'Income', 'exp1', 'exp4', 'exp5', 'exp6', 'exp7',
'exp8', 'exp11'
, 'exp12', 'exp13', 'Income_Mis', 'exp2', 'exp3', 'exp9', 'inc2', 'inc1', 'exp14']
dataset.drop(to_drop, inplace=True, axis=1)
dataset = pd.get_dummies(dataset,
columns=['HSize', 'SSex', 'SAge', 'SMadrak', 'SActivity', 'SMarital',
'Tasarrof', 'Otagh',
'ZirBana'], drop_first=True)
target, feature_list = 'DV', [i for i in dataset.columns if i not in target]
def init_population(n, c):
return np.array([[math.ceil(e) for e in pop] for pop in (np.random.rand(n, c) - 0.5)]),
np.zeros((2, c))-1
def single_poin_crossover(population):
r, c, n = population.shape[0], population.shape[1], np.random.randint(1, population.shape[1])
for i in range(0, r, 2):
population[i], population[i 1] = np.append(population[i][0:n], population[i 1]
[n:c]), np.append(
population[i 1][0:n], population[i][n:c])
return population
def flip_mutation(population):
return population.max() - population
def random_selection(population):
r = population.shape[0]
new_population = population.copy()
for i in range(r):
new_population[i] = population[np.random.randint(0, r)]
return new_population
def get_fitness(data, feature_list, target, population):
fitness = []
for i in range(population.shape[0]):
columns = [feature_list[j] for j in range(population.shape[1]) if population[i, j] == 1]
fitness.append(predictive_model(data[columns], data[target]))
return fitness
def predictive_model(X, y):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
lr = LogisticRegression(solver='liblinear', max_iter=100, random_state=7)
lr.fit(X_train, y_train)
return accuracy_score(y_test, lr.predict(X_test))
def genetic_algorithm(data, feature_list, target, n, max_iter):
c = len(feature_list)
population, memory = init_population(n, c)
temp1 = population
temp2 = memory
population, memory = temp2, temp1
fitness = get_fitness(data, feature_list, target, population)
optimal_value = max(fitness)
optimal_solution = population[np.where(fitness == optimal_value)][0]
for i in range(max_iter):
population = random_selection(population)
population = single_poin_crossover(population)
if np.random.rand() < 0.3:
population = flip_mutation(population)
temp1 = population
temp2 = memory
population, memory = temp2, temp1
fitness = get_fitness(data, feature_list, target, population)
if max(fitness) > optimal_value:
optimal_value = max(fitness)
optimal_solution = population[np.where(fitness == optimal_value)][0]
return optimal_solution, optimal_value
feature_set, acc_score = genetic_algorithm(dataset, feature_list, target, 10, 1000)
feature_set = [feature_list[i] for i in range(len(feature_list)) if feature_set[i] == 1]
print('Optimal Feature Setn', feature_set, 'nOptimal Accuracy = ', round(acc_score * 100), '%')
Первая ошибка:
цель, список функций = ‘DV’, [i для i в наборе данных.столбцы, если я не в цели]
Ошибка типа: аргумент типа «модуль» не может быть повторен
для кода:
target, feature_list = 'DV', [i for i in dataset.columns if i not in target]
Вторая ошибка:
Если я удалю эту часть приведенного выше кода:
if i not in target
Появляется эта ошибка:
поднять ошибку ключа(ключ) из ошибки Ошибка ключа: ‘DV’
Я написал этот код, и до сих пор эта проблема не возникла.
Если вы видите какие-либо другие ошибки, пожалуйста, помогите мне их исправить.
Пожалуйста, помогите мне, если это возможно, или введите правильный код
Спасибо.
Комментарии:
1. Похоже, у вас здесь может возникнуть некоторая переменная путаница. Во-первых, что находится
import target as target
наверху? Строка, в которой содержится ошибка, должна выдавать ошибку, напримерNameError: name 'target' is not defined
, за исключением того, что вы импортировали цель из другого модуля, но пытаетесь ее назначить. Проблемаtarget
'DV'
в том, что это происходит только после его назначения, а не потому, что вы не можете назначить его таким образом в той же строке, в которой вы пытаетесь его использовать. Разбейте эту линию на две линии, и, возможно, вы получите лучший результат2. У вас есть какие-либо предложения по выполнению этого кода?