Beim Predictive Modellig erstrebt man gute (d.h. möglichst trennscharfe) Risiko/Chancen Scores mittels “des besten Modells”. Dieses wendet man auf neue Daten an, um ausgewählten Risikoklassen bestimmte Maßnahmen zukommen zu lassen. In dieser Standardsituation kommt eine große Auswahl an Machine Learning und Data Mining Verfahren für die Modellierung zur Anwendung.
In der Statistik hingegen ist man mehr an den Modell-Treibern einer Ursache-Wirkungsbeziehung interessiert, das heißt man sucht nach statistisch signifikanten Aussagen über Versuchs- und Messreihen ob z.B. eine bestimmte medizinische Therapie zur Heilung einer Krankheit führt. Für diese analytische Fragestellung wäre man mit einem Entscheidungsbaum oder einem logistischen Regressionsmodell besser bedient.
In einigen Fällen hat man eine leicht modifizierte Fragestellung des zweiten Falls: Man möchte die Treiber identifizieren und Ihre quantitativen Effekte schätzen, weiß aber auch, dass diese Effekte nur positiv aber nie negativ sein können. Das entspricht einer logistischen Regression, bei der die Koeffizienten aber nicht negativ sein können, sondern nur positiv. Für die Lineare Regression gibt es zu diesem Zwecke mehrere SAS Prozeduren, die Nebenbedingungen für die Regressionskoeffizienten ermöglichen. Für die Logistische Regression ist dies leider nicht direkt in der PROC LOGISIC möglich, weil die Maximum Likelihood Funktion nichtlinear ist, und somit in der Lösung unangenehme numerische Komplikationen mit sich bringt. Deshalb muss man die Maximum Likelihood Funktion des über Nebenbedingungen eingeschränkten Problems mit der SAS Prozedur PROC NLIN eigenhändig aufsetzen.
Nun fragt man sich, ist denn so eine relativ komplexe Modifikation des Logistischen Regressionsmodells überhaupt in der Praxis notwendig? In der Tat gibt es ein immer wieder interessantes kommerzielles Anwendungsszenario, das schon Henry Ford prägnant mit der Aussage “Ich weiß, die Hälfte meiner Werbung ist hinausgeworfenes Geld. Ich weiß nur nicht, welche Hälfte.” umschrieben hat. Übersetzt in die moderne Internet Ökonomie liegt dieses Szenario vor, wenn die Effektivität der teuer eingekauften Online Banner Werbung optimiert werden soll, um für einen Zeithorizont in der Zukunft das Werbebudget effizienter auszulegen.
Im folgenden Beispiel wird dies an simulierten Daten durchgeführt. Erst wird das Logistische Modell ohne Nebenbedingungen geschätzt:
- mittels PROC NLIN (Ohne Nebenbedingungen)
- mittels PROC LOGISTIC (Ohne Nebenbedingungen)
- mittels PROC NLIN (Mit Nebenbedingungen)
Im Anschluss werden die geschätzten Likelihood Functions, Modellparameter und Scores miteinander gegenübergestellt und verglichen. Die Input-Variablen x1-x6 beinhalten historische Werte der geschalteten Online-Werbung und die binäre Target-Variable Conversion_Click beinhaltet diejenigen historischen "Clicks" auf die Online Werbung die zu einer gewollten relevanten Kundeninteraktion geführt haben. Die geschätzten Modellparameter (unter den Nebenbedingungen _x1-_x6>0) geben an, wieviel des Werbebugets auf die jeweilige Bannerwerbung am wirkungsvollsten verteilen sollte. Da Werbeausgaben immer nur positiv sein können, müssen die Nebenbedingungen der Positivität eingehalten werden. Bedenken Sie aber auch, dass die Einführung der Nebenbedingungen Ihr Model verschlechtern. Diese Verschlechterung ist der Maximum Likelihood Funktion ML zu entnehmen und spiegelt sich auch in einer schlechteren Trennschärfe und Confusion Matrix wieder.
Dieses Beispiel zeigt, dass wir in der heutigen “BigData-Online-Welt” wohl nicht mehr wie Henry Ford von jedem Werbe-Euro 50 Cents aus dem Fenster werfen müssen. Das Optimierungspotential ist erfreulich groß. Laut BVDW hatte der deutsche Markt für Online Werbung im Jahr 2012 ein Volumen von 6,44 Mrd €. Ich hoffe diese kleine Anregung hilft Ihnen, in Zukunft ihren Teil dieser Ausgaben zu optimieren. Ist doch Schade wenn man unnötig viel Geld aus dem Fenster wirft…
Stay tuned
TobyText
data Banner_expenditure; input Conversion_Click X1 X2 X3 X4 X5 X6; like = 0; label like = "dummy variable for nlin"; datalines; 1 0.8 .83 .66 1.9 1.10 .996 1 0.9 .36 .32 1.4 0.74 .992 0 0.8 .88 .70 0.8 0.176 .982 0 1 .87 .87 0.7 1.053 .986 1 0.9 .75 .68 1.3 0.519 .980 0 1 .65 .65 0.6 0.519 .982 1 0.95 .97 .92 1 1.23 .992 0 0.95 .87 .83 1.9 1.354 1.020 0 1 .45 .45 0.8 0.322 .999 0 0.95 .36 .34 0.5 0 1.038 0 0.85 .39 .33 0.7 0.279 .988 0 0.7 .76 .53 1.2 0.146 .982 0 0.8 .46 .37 0.4 0.38 1.006 0 0.2 .39 .08 0.8 0.114 .990 0 1 .90 .90 1.1 1.037 .990 1 1 .84 .84 1.9 2.064 1.020 0 0.65 .42 .27 0.5 0.114 1.014 0 1 .75 .75 1 1.322 1.004 0 0.5 .44 .22 0.6 0.114 .990 1 1 .63 .63 1.1 1.072 .986 0 1 .33 .33 0.4 0.176 1.010 0 0.9 .93 .84 0.6 1.591 1.020 1 1 .58 .58 1 0.531 1.002 0 0.95 .32 .30 1.6 0.886 .988 1 1 .60 .60 1.7 0.964 .990 1 1 .69 .69 0.9 0.398 .986 0 1 .73 .73 0.7 0.398 .986 ; data Banner_expenditure; set Banner_expenditure; id+1; run; ods listing close; ods pdf; Title "Unbound Problem"; *Logistische Regression mit Proc NLIN Unbound; Ods output parameterestimates=estimates_NLIN_Unbound anova=LF_NLIN_Unbound(where=(strip(source) eq "Error") keep=ss source rename=(ss=LF)); proc nlin data=Banner_expenditure method=newton sigsq=1; parms _intercept=-10 _X1 = 2 _X5 = 1 _X6=6; * “_” Undersoce variables are Parameters to be optimized by NLIN; linp = _intercept + _X1*X1 + _X5*X5 + _X6* X6; p = exp(linp)/(1+exp(linp)); if (Conversion_Click = 0) then pi = 1-p; else pi = p; model.like = sqrt(- 2 * log(pi)); run; ods output close; *Gegentest mit Proc Logistic Unbound; Ods output parameterestimates=estimates_LOGISTIC_Unbound(rename=(Variable=Parameter)) fitstatistics=LF_LOGISTIC_Unbound(where=(criterion eq "-2 Log L") rename=(InterceptAndCovariates=LF)); proc logistic data=Banner_expenditure; model Conversion_Click(event='1')= X1 X5 X6; output out=Score_Logistic_Unbound p=P_LU ; run; ods output close; Title "Bound Problem:(_X1 >0 und _X6 > 0)"; *Logistische Regression mit Proc NLIN UND Nebenbedingungen (Bounds) in Koeffizienten _X1 _ X6 > 0; Ods output parameterestimates=estimates_NLIN_Bound anova=LF_NLIN_Bound(where=(strip(source) eq "Error") keep=ss source rename=(ss=LF)); proc nlin data=Banner_expenditure method=newton sigsq=1; parms _intercept=-10 _X1 = 2 _X5 = 1 _X6=6; bounds _X1 _X6 > 0;*Nebenbedingung Positivität; linp = _intercept + _X1*X1 + _X5*X5 + _X6* X6;* "_" Undersoce Variablen sind die Parameter, die NLIN schätzen soll; p = exp(linp)/(1+exp(linp)); if (Conversion_Click = 0) then pi = 1-p; else pi = p; model.like = sqrt(- 2 * log(pi)); run; ods output close; data est1; set estimates_nlin_Bound(where=(substr(parameter,1,1) eq "_")); Parameter=scan(Parameter,1,"_"); run; proc transpose data=est1 out=est2(drop=_name_); var estimate; id Parameter; run; data est3; set est2; _link_="LOGIT"; _TYPE_="PARMS"; _NAME_="Conversion_Click"; _esttype_="MLE"; x2=0; x3=0; x4=0; run; *Anwendung der mit Proc NLIN UND Nebenbedingungen gefundenen Koeffizienten in Proc Logistic um den Scoring Fit der Anpassung zu bwerten; Ods output parameterestimates=estimates_LOGISTIC_Bound(rename=(Variable=Parameter)) fitstatistics=LF_LOGISTIC_Bound(where=(criterion eq "-2 Log L") rename=(InterceptAndCovariates=LF)); proc logistic data=Banner_expenditure inest=est3; model Conversion_Click(event='1') = X1 X4 X6 / maxiter=0; output out=Score_NLIN_Bound p=P_NB ; run; ods output close; data likelihood_all(keep=LF Proc bnd); set lf_: indsname=name; Parameter=scan(Parameter,1,"_"); Proc=scan(name,2,",_"); bnd=scan(name,3,",_"); run; proc sort;by descending bnd descending proc ;run; data est_all; length proc bnd Parameter $8; set estimates_: indsname=name; Parameter=scan(Parameter,1,"_"); Proc=scan(name,2,",_"); bnd=scan(name,3,",_"); run; proc sort;by descending bnd descending proc Parameter;run; options nolabel; data est_all; length proc bnd $10 LF 8 Parameter $12; merge likelihood_all est_all ; by descending bnd descending proc; if first.proc then N+1; label LF="Estimated*Likelihood"; run; Title "Parameter-Vergleich Bound und Unbound"; options pagesize=266; proc print noobs data=est_all label split="*"; var N LF proc bnd Parameter Estimate StdErr WaldChiSq ProbChiSq lowerCL upperCL; by N LF; ID N LF; run; data score_all; merge score_logistic_unbound score_nlin_bound; by id; I_NB=P_NB ge .5; I_LU=P_LU ge .5; run; Title "Score-Vergleich Bound und Unbound"; options pagesize=266; proc print noobs data=score_all label split="*"; var id x: p_: I_: Conversion_Click; run; Title "Confusion Matrix Logistic Model Unbound"; proc freq data=score_all; Tables Conversion_Click*I_LU; run; Title "Confusion Matrix NLIN Model Bound"; proc freq data=score_all; Tables Conversion_Click*I_NB; run; ods pdf close; |