Ceci est une continuation de Dernière fois. [Idol Master Cinderella Girls](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%82%A4%E3%83%89%E3%83%AB%E3%83%9E% E3% 82% B9% E3% 82% BF% E3% 83% BC_% E3% 82% B7% E3% 83% B3% E3% 83% 87% E3% 83% AC% E3% 83% A9% E3% Prédiction de 3 types (Cu, Co, Pa) à partir des données de profil de 183 personnes (en avril 2017) de 82% AC% E3% 83% BC% E3% 83% AB% E3% 82% BA) Je vais.
Les 16 objets suivants ont été acquis. C'est une matrice de 183 x 16. [Type, nom, âge, naissance, constellation, groupe sanguin, taille, poids, B, W, H, main dominante, ville natale, loisirs, CV, date de mise en œuvre]
Parmi ceux-ci, cette fois, nous utiliserons les 6 données suivantes pour prédire le type. [Âge, taille, poids, B, W, H]
Les types de données acquises étant tous des objets, convertissez-les en types numériques.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv
import pandas as pd
from pandas import DataFrame
import matplotlib
import matplotlib.pyplot as plt
def translate(df):
#Convertir le type de données en float
df['âge']=df['âge'].str.extract('([0-9]+)').astype(float)
df['la taille']=df['la taille'].astype(float)
df['poids']=df['poids'].str.extract('([0-9]+)').astype(float)
df['B']=df['B'].str.extract('([0-9]+)').astype(float)
df['W']=df['W'].str.extract('([0-9]+)').astype(float)
df['H']=df['H'].str.extract('([0-9]+)').astype(float)
#Conversion numérique des valeurs d'attribut
df.loc[df['attribut'] == "Cu", 'attribut'] = 0
df.loc[df['attribut'] == "Co", 'attribut'] = 1
df.loc[df['attribut'] == "Pa", 'attribut'] = 2
df['attribut']=df['attribut'].astype(int)
return df
if __name__ == '__main__':
#Lecture des données
df = pd.read_csv('aimasudata.csv')
df=translate(df)
«Puisque le japonais est parfois mélangé dans des données telles que l'âge, str.extract ('([0-9] +)') est utilisé pour extraire uniquement les nombres. \ ([Eternal ○ ans] → [○]. Vous l'avez fait!)
Représentons graphiquement les données pour voir si elles sont vraiment perceptibles par l'apprentissage automatique.
def checkdata(df,index):
#Obtenez des données pour chaque type
x1 = [df[index][df['attribut']==0]]
x2 = [df[index][df['attribut']==1]]
x3 = [df[index][df['attribut']==2]]
#Générer un histogramme
plt.hist([x1,x2,x3], bins=16)
#Enregistrer l'image
plt.savefig("%s_graph.png " %index)
#Affichage de l'image
plt.show()
if __name__ == '__main__':
#Lecture des données
df = pd.read_csv('row_data.csv')
df=translate(df)
checkdata(df,"âge")
Bleu: Cu, Orange: Co, Vert: Pa. Co compte une forte proportion de personnes âgées.
Le Cu est-il bas et Co élevé? Ces données font la plus grande différence.
La différence n'est pas grande, mais Co est légèrement plus élevée. Globalement trop léger.
B
W
H Dans le système de données corporelles, la valeur de Co est élevée dans son ensemble. La séparation du Cu et du Pa est-elle subtile?
Cette fois, nous utiliserons SVM pour déterminer trois classes (Co, Cu, Pa). Puisqu'il est nécessaire de définir des paramètres lors de la mise en œuvre de SVM, Tout d'abord, utilisez la recherche de grille pour déterminer les paramètres à appliquer à SVM.
[Optimisation des paramètres par recherche de grille de Scikit learn] (http://qiita.com/SE96UoC5AfUt7uY/items/c81f7cea72a44a7bfd3a)
def gridsearch(df):
tuned_parameters = [{'C': [1, 10, 100, 1000, 10000], 'kernel': ['rbf'], 'gamma': [0.01,0.001, 0.0001]}]
score = 'f1'
clf = GridSearchCV(
SVC(), #Identifiant
tuned_parameters, #Jeu de paramètres que vous souhaitez optimiser
cv=5, #Nombre de tests croisés
scoring='%s_weighted' % score ) #Spécification de la fonction d'évaluation du modèle
df = df.dropna(subset=['âge','la taille','poids','B','W','H'])
X = df[['âge','la taille','poids','B','W','H']]
y = df["attribut"]
clf.fit(X, y)
print"mean score for cross-validation:\n"
for params, mean_score, all_scores in clf.grid_scores_:
print "{:.3f} (+/- {:.3f}) for {}".format(mean_score, all_scores.std() / 2, params)
print clf.best_params_
Le résultat semble être meilleur lorsque C = 100 et gamma = 0,0001.
Implémentez SVM en utilisant les paramètres obtenus par la recherche de grille.
def dosvm(df):
#Supprimer les lignes avec des valeurs manquantes
df=df.dropna(subset=['âge','la taille','poids','B','W','H'])
X = df[['âge','la taille','poids','B','W','H']]
y = df["attribut"]
data_train,data_test,label_train,label_test=train_test_split(X,y,test_size=0.2)
clf = svm.SVC(kernel="rbf",C=100,gamma=0.0001)
clf.fit(data_train, label_train)
result=clf.predict(data_test)
cmat=confusion_matrix(label_test,result)
acc=accuracy_score(label_test,result)
print cmat
print acc
Après environ 100 essais, j'ai pu déterminer avec une précision d'environ 0,45. En regardant la matrice de confusion, il semble que Pa ne soit pas bien prédit.
«Quand j'ai commencé, je me demandais si je pouvais l'identifier, mais j'ai pu l'identifier de manière inattendue.
Recommended Posts