zondag 10 april 2016

03 - Santander Customer Satisfaction - Eerste submission

Gisteren mijn eerste submission gemaakt in de competitie. Hoewel nog zeker geen bijster resultaat, 0.729499 en dus 2898 (van de 3549) op de ranglijst, wel de gehele 'workstream' zelf gemaakt.


De hoogste score is vandaag 0.843381 dus dat is iig de uitdaging :-)


De eerste kolom (feature) selectie heb ik in mijn voorgaande bericht beschreven. In het 2e deel maak ik eerst de balans tussen het aantal ontevreden en tevreden klanten wat meer evenredig. De trainset ziet er als volgt uit:

  • 76.020 aantal klanten
  • 3.009 aantal ontevreden klanten
  • Dat is dus 3,958%
Om de trainset wat meer evenredig te maken selecteer ik 1/5 van de tevreden klanten. (15.204) Samen met de 3.009 ontevreden klanten komt de trainset formeel dan op 18.213. (In praktijk 17.834 - Ik moet ook uitzoeken hoe dat verschil komt.) Een loop door de data blijkt enorm traag te verlopen. Ik verzin een slimmere code:


Select = .2 # Select approximately 5x satisfied customer records compared to non satisfied

# First select all records with satisfied customers y[:1] = 0
X_tr = DataTr[y[:,1]==0]
y_tr = y[y[:,1]==0]

# Make random array of lengh number of rows X_tr. Then select only those with value lower than 'Select'.
Sel = np.random.rand(X_tr.shape[0])
X_tr = X_tr[Sel[:]<Select]
y_tr = y_tr[Sel[:]<Select]

# Add all dissatisfied customers
X_tr = np.vstack((X_tr,DataTr[y[:,1]==1]))
y_tr = np.vstack((y_tr,y[y[:,1]==1] ))


Dat werkt teminste snel!
De testset bestaat uit:
  • 75.818 aantal klanten.
  • Ik verwacht dus feitelijk 3,958 * 75.818 = 3001 ontevreden klanten.
Het eerste model heeft ~ 50 epochs doorlopen. Ik heb hem nogmaals aangeboden met ~ 100 epochs maar dan gaat het resultaat achteruit. Tijd dus voor meer serieuze aanpassingen.

Ik denk in ieder geval aan de volgende:
  • Splitsen van traindata in een train en validatie set. Was er nog niet van gekomen.
  • Per epoch een nieuwe trainset voor de tevreden klanten. Hoewel deze random wordt gekozen zorgt eenzelfde 'seed' voor steeds dezelfde dataset Dit is noodzakelijk wegens de, door Kaggle, vereiste herhaalbaarheid. MAar ik kan de seed wel steeds gecontroleerd aanpassen per epoch.
  • Ik wil dus uitkomen op ongeveer 3001 ontevreden klanten. Wellicht helpt het om de submission aan te passen zodat 3001 van de kansen boven de 0.5 uitkomen. 
  • Bewaren van de optimale 'weights'.
  Misschien bedenk ik ondertussen nog wel iets extras. Eerst dit maar eens proberen.






Geen opmerkingen:

Een reactie posten