Je voulais faire du machine learning, alors j'ai choisi "Pokemon". Je pensais que Pokemon était un joyau de données car la valeur de la race était décidée pour chaque Pokémon.
Cependant, cette fois, il s'agit d'un article entièrement rétrocompatible </ b> basé sur celui qui est sorti en haut en recherchant "Pokemon Machine Learning" sur Google, donc si vous souhaitez l'imiter, veuillez vous référer à l'article original. S'il te plait donne moi. Apprentissage automatique avec Pokemon
OS:Win10 home IDE:VScode Langage: python 3.7.3 64bit
Basé sur base de données Pokemon jusqu'à 7 générations, les Pokémon de "Hiko" et "Esper" sont extraits et binarisés par régression logistique. Je l'ai essayé. À propos, le nombre de chaque type dans Pokemon est le suivant (jusqu'à 7 générations)
type | Nombre d'animaux |
---|---|
Ordinaire | 116 animaux |
finalement | 63 animaux |
Doku | 69 animaux |
Jimen | 75 animaux |
vol | 113 animaux |
insecte | 89 animaux |
Iwa | 67 animaux |
fantôme | 55 animaux |
Hagane | 58 animaux |
Hono | 72 animaux |
Mizu | 141 animaux |
Denki | 60 animaux |
Kusa | 103 animaux |
Koori | 43 animaux |
Esper | 100 animaux |
Dragon | 59 animaux |
Mal | 59 animaux |
Fée | 54 animaux |
Mizu était le plus grand et Koori était le plus petit. Il est lyophilisé et doublé.
Le code est ci-dessous.
lr_pokemon.py
import pandas as pd
import codecs
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# read data by pandas
with codecs.open("data/pokemon_status.csv", "r", "Shift-JIS", "ignore") as file:
df = pd.read_table(file, delimiter=",")
# print(df.head(15))
p_type = ["Ordinaire","finalement","Doku","Jimen","vol","insecte","Iwa","fantôme","Hagane","Hono","Mizu","Denki","Kusa","Koori","Esper","Dragon","Mal","Fée"]
print(len(p_type))
# make functions
def count_type(p_type):
list1 = df[df['Type 1'] == p_type]
list2 = df[df['Type 2'] == p_type]
lists = pd.concat([list1, list2])
print(p_type + "Pokémon: %d animaux" % len(lists))
def type_to_num(p_type):
if p_type == "vol":
return 1
else:
return 0
# count number of type in pokemons
for i in p_type:
count_type(i)
# make sky_df
sky1 = df[df['Type 1'] == "vol"]
sky2 = df[df['Type 2'] == "vol"]
sky = pd.concat([sky1, sky2])
# make psycho_df
psycho1 = df[df['Type 1'] == "Esper"]
psycho2 = df[df['Type 2'] == "Esper"]
psycho = pd.concat([psycho1, psycho2])
df_s_p = pd.concat([sky, psycho], ignore_index=True)
type1 = df_s_p['Type 1'].apply(type_to_num)
type2 = df_s_p['Type 2'].apply(type_to_num)
df_s_p['type_num'] = type1 + type2
print(df_s_p)
X = df_s_p.iloc[:,7:13].values
y = df_s_p['type_num'].values
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)
lr = LogisticRegression(C = 1.0)
lr.fit(X_train, y_train)
# show scores
print("train_score: %.3f" % lr.score(X_train, y_train))
print("test_score: %.3f" % lr.score(X_test, y_test))
i = 0
error1 = 0
success1 = 0
error2 = 0
success2 = 0
print("[Liste des Pokémon jugés de type Hiko]")
print("----------------------------------------")
print("")
while i < len(df_s_p):
y_pred = lr.predict(X[i].reshape(1, -1))
if y_pred == 1:
print(df_s_p.loc[i, ["Nom du Pokémon"]])
if df_s_p.loc[i, ["type_num"]].values == 1:
success1 += 1
print("C'est du type hikou, n'est-ce pas?")
print("")
else:
error1 += 1
print("Je pensais que c'était du type hikou")
print("")
else:
print(df_s_p.loc[i, ["Nom du Pokémon"]])
if df_s_p.loc[i, ["type_num"]].values == 0:
error2 += 1
print("C'est du type Esper, n'est-ce pas?")
print("")
else:
success2 += 1
print("Je pensais que c'était un type Esper")
print("")
i += 1
print("----------------------------------------")
print("Nombre de Pokémon jugés du type correct: %d animaux" % success1)
print("Nombre de Pokémon correctement jugés de type Esper: %d animaux" % success2)
print("Nombre de Pokémon identifiés par erreur comme un type de randonnée: %d animaux" % error1)
print("Nombre de Pokémon identifiés par erreur comme de type Esper: %d animaux" % error2)
print("")
Le résultat a été un taux de réponse correcte de 75%. C'est bas. C'était un nombre qui ne pouvait pas être utilisé dans l'apprentissage automatique.
Je pensais pouvoir obtenir de meilleurs chiffres. Parce que je pensais que "Hiko" pouvait être grossièrement divisé en attaquants physiques et "Esper" pourrait être grossièrement divisé en attaquants spéciaux. La réalité n'est pas si simple. Cependant, quand j'ai vu le Pokémon faussement détecté, j'ai eu la raison pour laquelle je ne le détecterais même pas à tort. Par exemple, il y avait "Thunder" et "Freezer" comme des enfants qui ont été confondus avec Esper même s'ils étaient hilarants, mais c'est vrai parce qu'ils sont chers. Je ferais une erreur si je le voyais pour la première fois. D'un autre côté, il y avait "Casey" et "Lartos" en tant qu'enfants qui ont été pris à tort pour être un Esper, mais je pensais que cela ne pouvait pas être aidé parce que ce sont de faibles valeurs raciales. Parce qu'il est difficile de faire une différence dans la valeur numérique dans la plage de valeurs de course basse. L'évolutionnaire "Hoodin", "Sarnite" et "El Reid" ont été assignés à Bakko Esper, donc je suis soulagé.
El Reid Han! Je me demande si vous auriez pu être confondu avec un type hikou! !! !!
Après tout, il est faux de juger Pokemon uniquement par la valeur de la race.
Recommended Posts