Несколько ошибок при выборе важных признаков с помощью генетических алгоритмов:

#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. У вас есть какие-либо предложения по выполнению этого кода?