VARIABLE DESCRIPTIONS: survival Survival (0 = No; 1 = Yes) pclass Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd) name Name sex Sex age Age sibsp Number of Siblings/Spouses Aboard parch Number of Parents/Children Aboard ticket Ticket Number fare Passenger Fare cabin Cabin embarked Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton)Ik besluit om in ieder geval eerst wat algemene routines te maken om een dergelijk soort probleem aan te pakken. Het beste is als elke relevante kolom zich uiteindelijk in een getal vertaald met een range 0.0 to 1.0.
Dat wil zeggen voor 'klasse variabelen' (bijvoorbeeld [male, female]) eerst de klassen bepalen (bijeenzetten), het aantal klassen tellen en vervolgens ze toewijzen aan een ongelijke waarde tussen 0 en 1. Klinkt misschien simpel en dat is het ook zodra je de juiste Python/Numpy codering erbij hebt gevonden.
Voor de 'numerieke variabelen' moet alles gewoon gedeeld worden door de maximale waarde. Oh ja, eerst even zorgen dat alles echt als numeriek wordt gezien. Tja ... en 'leeg' maar voorlopig aan nul toewijzen hoewel ik nog niet zo goed kan inschatten welk effect dat gaat hebben.
Twee avondjes worstelen en ik heb een redelijk cleane dataset. Eerst maar eens door een sklearn routine leiden: SVM (support vector machines) Geeft al een redelijke score (± 70%) Met wat sleutelen aan de parameters weet ik het tot 84,6% op te krikken! Helaas blijkt de gekozen 'testset' toch wat relevant. Bij een andere 'sub-set' duikt hij terug naar 79%. Maar goed, we kunnen nu van alles gaan uitproberen. Who needs a hobby ... :-)
Oh ja, de code:
import csv
import numpy as np
def isnum(x): # test of nummeriek en dan omzetten naar float - Lege velden zijn 0
z = x
try:
x = x.__str__()
if str.strip(x) == '':
x = '0'
if x.find('.')>=0 and x.find(',')>=0:
x = x.replace('.','')
x = x.replace(',','.',1)
y = x.replace('-','',1)
y = y.replace('+','',1)
y = y.replace('.','',1)
if y.isdigit():
z = float(x)
return z
except ValueError:
return z
# File inlezen
file = '/Users/DWW/Downloads/train.csv'
with open(file,'rb') as f:
reader = csv.reader(f)
S = list(reader)
Labels = S[0] # Alleen de eerste rij: De labels
Data = S[1:] # Data zonder de labels
num_cols = [5] # De numeriek te behandelen kolommen
class_cols = [2,4,6,7] # De 'klassen' kolommen
tekst_cols = [0,1,3,8,9,10,11] # De 'irrelevante' kolommen
#transform class rows + num rows
for j in range(0,len(Data[0])):
if j in class_cols:
c = sorted(list(set([Col[j] for Col in Data]))) # c = list met de verschillende klassen.
l = len(c) # l = aantal klassen
for i in range(0,len(Data)):
Data[i][j] = float(c.index(Data[i][j])+1)/l # verdeel over 0.0 ... 1.0
if j in num_cols:
for i in range(0,len(Data)):
Data[i][j] = isnum(Data[i][j])
c = max([Col[j] for Col in Data])
for i in range(0,len(Data)):
Data[i][j] = Data[i][j]/ c # verdeel over 0.0 ... 1.0
DataN = np.array(Data) # Volledig overzetten van Python naar Numpy
DataN = np.delete(DataN,[tekst_cols],1) # Verwijderen iirelevante kolommen
DataN = np.array(DataN,dtype=np.float) # float-type van maken
X = DataN # Alle waarden
Y = [Col[1] for Col in Data] # Alle uitkomsten
x,y = X[100:], Y[100:] # Oefendeel
xt,yt = X[:100], Y[:100] # Testdeel
print x.shape, xt.shape
from sklearn import svm
# Testen verschillende waardes van SVM (support vector machine) parameters: gamma en C
for gammas in [.8,.9,1.,1.5]:
for Cs in [1000,1500]:
clf = svm.SVC(gamma=gammas, C=Cs)
clf.fit(x,y)
print ('gamma, C = ',gammas,Cs,'Prediction : ',clf.score(xt,yt))
Geen opmerkingen:
Een reactie posten