Dies ist eine Fortsetzung von Letztes Mal. [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% Vorhersage von 3 Typen (Cu, Co, Pa) aus Profildaten von 183 Personen (Stand April 2017) von 82% AC% E3% 83% BC% E3% 83% AB% E3% 82% BA) Ich werde.
Die folgenden 16 Artikel wurden erworben. Es ist eine 183 x 16 Matrix. [Typ, Name, Alter, Geburt, Konstellation, Blutgruppe, Größe, Gewicht, B, B, H, dominante Hand, Heimatstadt, Hobbys, Lebenslauf, Implementierungsdatum]
Von diesen werden wir dieses Mal die folgenden 6 Daten verwenden, um den Typ vorherzusagen. [Alter, Größe, Gewicht, B, B, H]
Da die Typen der erfassten Daten alle Objekte sind, konvertieren Sie sie in numerische Typen.
#!/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):
#Konvertieren Sie den Datentyp in float
df['Alter']=df['Alter'].str.extract('([0-9]+)').astype(float)
df['Höhe']=df['Höhe'].astype(float)
df['Körpergewicht']=df['Körpergewicht'].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)
#Numerische Konvertierung von Attributwerten
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__':
#Daten gelesen
df = pd.read_csv('aimasudata.csv')
df=translate(df)
―― Da Japanisch manchmal in Daten wie Alter gemischt wird, wird str.extract ('([0-9] +)') verwendet, um nur die Zahlen zu extrahieren. \ ([Ewig ○ Jahre alt] → [○]. Du hast es geschafft!)
Lassen Sie uns die Daten grafisch darstellen, um festzustellen, ob sie durch maschinelles Lernen wirklich erkennbar sind.
def checkdata(df,index):
#Daten für jeden Typ abrufen
x1 = [df[index][df['Attribut']==0]]
x2 = [df[index][df['Attribut']==1]]
x3 = [df[index][df['Attribut']==2]]
#Histogramm erstellen
plt.hist([x1,x2,x3], bins=16)
#Bild speichern
plt.savefig("%s_graph.png " %index)
#Bildschirm
plt.show()
if __name__ == '__main__':
#Daten gelesen
df = pd.read_csv('row_data.csv')
df=translate(df)
checkdata(df,"Alter")
Blau: Cu, Orange: Co, Grün: Pa. Co hat einen hohen Anteil älterer Menschen.
Ist Cu niedrig und Co hoch? Diese Daten machen den größten Unterschied.
Der Unterschied ist nicht groß, aber Co ist etwas höher. Insgesamt zu leicht.
B
W
H Im Körperdatensystem ist der Wert von Co insgesamt hoch. Ist die Trennung von Cu und Pa subtil?
Dieses Mal werden wir SVM verwenden, um drei Klassen (Co, Cu, Pa) zu bestimmen. Da bei der Implementierung von SVM Parameter festgelegt werden müssen, Verwenden Sie zunächst die Rastersuche, um die Parameter zu bestimmen, die auf SVM angewendet werden sollen.
[Parameteroptimierung durch Rastersuche von Scikit lernen] (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(), #Identifikator
tuned_parameters, #Parametersatz, den Sie optimieren möchten
cv=5, #Anzahl der Kreuztests
scoring='%s_weighted' % score ) #Angabe der Bewertungsfunktion des Modells
df = df.dropna(subset=['Alter','Höhe','Körpergewicht','B','W','H'])
X = df[['Alter','Höhe','Körpergewicht','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_
Das Ergebnis scheint am besten zu sein, wenn C = 100 und Gamma = 0,0001.
Implementieren Sie SVM mithilfe der durch die Rastersuche erhaltenen Parameter.
def dosvm(df):
#Löschen Sie Zeilen mit fehlenden Werten
df=df.dropna(subset=['Alter','Höhe','Körpergewicht','B','W','H'])
X = df[['Alter','Höhe','Körpergewicht','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
Nach ungefähr 100 Versuchen konnte ich mit einer Genauigkeit von ungefähr 0,45 bestimmen. Betrachtet man die Verwirrungsmatrix, so scheint es, dass Pa nicht gut vorhergesagt wird.
―― Als ich anfing, fragte ich mich, ob ich es überhaupt identifizieren konnte, aber ich konnte es unerwartet identifizieren.
Recommended Posts