Commit 9b9ca03d authored by Ulmer Louis's avatar Ulmer Louis
Browse files

maj projet iml

parent 98d649be
......@@ -28,6 +28,9 @@ meilleur_C=zeros(K,1)
for k=1:1:K
[xapp,yapp,xval,yval]=SepareDataNfoldCV(xapp,yapp,K,k)
meanx=mean(xapp);
stdx=std(xapp);
[xapp,xtest,,n] = normalizemeanstd(xapp,xtest)
% evaluation d'un modle
vectC=logspace(-2,2,9) %echelle logarithmique
precision=zeros(length(vectC),1);
......
......@@ -179,11 +179,11 @@ k=meilleur_K;
err = mean(ytest~=ypred)
% On trouve une erreur de 9.55% avec le meilleur k (13) qui est une bonne
% performance dans la realite.
%% SVM
%% SVM Normal
yapp(yapp==0)=-1;
ytest(ytest==0)=-1;
yval(yval==0)=-1;
%%
%
% evaluation d'un modele
vectC=logspace(-2,2,9) %echelle logarithmique
precision=zeros(length(vectC),1);
......@@ -221,7 +221,9 @@ end
meilleur_CC=[vectC(pos_i) ; vectC(pos_j)]
%%
C=zeros(length(yapp),1);
C(yapp==1)= meilleur_C(1);
C(yapp==-1)= meilleur_C(2);
[wapp,b]=monsvmclass(xapp,yapp,meilleur_C);
ypred=monsvmval(xtest,wapp,b);
%f(x) et y on le meme signe ?
......
%% Import data from text file.
% Script for importing data from the following text file:
%
% /Users/louis/Documents/INSA/ASI4_LouisULMER/IML/projet_IML/bank-additional-full.csv
%
% To extend the code to different selected data or a different text file,
% generate a function instead of a script.
% Auto-generated by MATLAB on 2019/01/07 14:29:01
% Initialize variables.
filename = 'bank-additional-full.csv';
startRow = 2;
delimiter=';';
% Format for each line of text:
% column1: double (%f)
% column2: categorical (%C)
% column3: categorical (%C)
% column4: categorical (%C)
% column5: categorical (%C)
% column6: categorical (%C)
% column7: categorical (%C)
% column8: categorical (%C)
% column9: categorical (%C)
% column10: categorical (%C)
% column11: double (%f)
% column12: double (%f)
% column13: double (%f)
% column14: double (%f)
% column15: categorical (%C)
% column16: double (%f)
% column17: double (%f)
% column18: double (%f)
% column19: double (%f)
% column20: double (%f)
% column21: categorical (%C)
% For more information, see the TEXTSCAN documentation.
formatSpec = '%f%C%C%C%C%C%C%C%C%C%f%f%f%f%C%f%f%f%f%f%C%[^\n\r]';
% Open the text file.
fileID = fopen(filename,'r');
% Read columns of data according to the format.
% This call is based on the structure of the file used to generate this
% code. If an error occurs for a different file, try regenerating the code
% from the Import Tool.
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'TextType', 'string', 'EmptyValue', NaN, 'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n');
% Close the text file.
fclose(fileID);
% Post processing for unimportable data.
% No unimportable data rules were applied during the import, so no post
% processing code is included. To generate code which works for
% unimportable data, select unimportable cells in a file and regenerate the
% script.
% Allocate imported array to column variable names
age = dataArray{:, 1};
job = dataArray{:, 2};
marital = dataArray{:, 3};
education = dataArray{:, 4};
default = dataArray{:, 5};
housing = dataArray{:, 6};
loan = dataArray{:, 7};
contact = dataArray{:, 8};
month1 = dataArray{:, 9};
day_of_week = dataArray{:, 10};
duration = dataArray{:, 11};
campaign = dataArray{:, 12};
pdays = dataArray{:, 13};
previous = dataArray{:, 14};
poutcome = dataArray{:, 15};
empvarrate = dataArray{:, 16};
conspriceidx = dataArray{:, 17};
consconfidx = dataArray{:, 18};
euribor3m = dataArray{:, 19};
nremployed = dataArray{:, 20};
y = dataArray{:, 21};
% Clear temporary variables
clearvars filename delimiter startRow formatSpec fileID dataArray ans;
%% Codage Disjonctif y
ind_yes = find(y=='yes');
Y = zeros(length(y),1);
Y(ind_yes)=1;
%% Procedure suppression NAN value
X=table(age,campaign,consconfidx,conspriceidx,default,duration,education,empvarrate,euribor3m,housing,job,loan,marital,nremployed,pdays,poutcome,previous,Y);
%% Suppression des "unknown" de job et education
idx=any(strcmp(cellstr([job, education, housing, loan, marital]),'unknown'),2);
X(idx,:) = [];
Y(idx) = [];
%% Codage Disjonctif des autres variables
age=X.age;
campaign=X.campaign;
consconfidx=X.consconfidx;
conspriceidx=X.conspriceidx;
duration=X.duration;
empvarrate=X.empvarrate;
euribor3m=X.euribor3m;
nremployed=X.nremployed;
previous=X.previous;
pdays=X.pdays;
housing=disjonctif2(X.housing);
poutcome=disjonctif2(X.poutcome);
job=disjonctif2(X.job);
loan=disjonctif2(X.loan);
marital=disjonctif2(X.marital);
education=disjonctif2(X.education);
default=disjonctif2(X.default);
%%
% On passe en matriciel
X=[age consconfidx conspriceidx default duration education empvarrate euribor3m housing job loan marital nremployed poutcome];
%% Matrice de correlation
correlation_matrix(X);
% on observe des correlations entre
% cons.price.idx || contact
% A VOIR DIMENSSION CHAQUE LABEL
%% PCA
[valpropres, U, moy]=mypca(X);
bar(valpropres/sum(valpropres));
title('Valeurs propres')
% Dimension des datas projetees
d=2;
P=U(:,1:d);
C=projpca(X,moy,P);
figure
plot(C(Y==1,1),C(Y==1,2),'ro')
hold on
plot(C(Y==0,1),C(Y==0,2),'bo')
% L'acp ne nous aide pas
%% Modalits de chaque classe
% Compter les occurences
label0=sum(Y==0)
label1=sum(Y==1)
% On constate un desechilibre entre les deux classes, il faudait penser a
% faire une SVM avec penalisation differente en fonction des points
%% Downsampling
Z = [X Y];
[n p]=size(X);
Z = mydownsampling(Z,10);
X_small=Z(:,1:end-1);
Y_small=Z(:,end);
%% Depouage des donnees
ratio =2/3;
[xapp, yapp, xtest, ytest] = splitdata(X_small, Y_small, ratio);
ratio = 1/2;
[xapp, yapp, xval, yval] = splitdata(xapp, yapp, ratio);
%% Centrer reduire
meanx = mean(xapp);
stdx=std(xapp);
[xapp,xval,~,~] = normalizemeanstd(xapp,xval,meanx,stdx);
[~,xtest,~,~] = normalizemeanstd(xapp,xtest,meanx,stdx);
%% 2.2 Methode des K-ppV
k=3;
[ypred,MatDist]=kppv(xval, xapp, yapp, k, []);
err = mean(yval~=ypred)
% Erreur obtenue avec k=3 : 10.07%
%% choix d'une valeur de k
vectK=floor(linspace(1,20,10)); %echelle lineaire des valeurs de k possibles
% evaluation d'un modele
err=zeros(length(vectK),1); %prealocation du vecteur pour gagner en performance
for i=1:1:length(vectK)
[ypred,MatDist]=kppv(xval, xapp, yapp, vectK(i), []);
err(i) = mean(yval~=ypred); %calcul de l'erreur de validation
end
[val,pos] = min(err); %On trouve l'indice du vecteur pour lequel l'erreur et minimale
meilleur_K=(vectK(pos)) % On selectione le meilleur k possible grace a l'indice
%% essai de cette valeur sur les donnes de test
k=meilleur_K;
[ypred,MatDist]=kppv(xtest, xapp, yapp, k, []);
err = mean(ytest~=ypred)
% On trouve une erreur de 9.55% avec le meilleur k (13) qui est une bonne
% performance dans la realite.
%% SVM
yapp(yapp==0)=-1;
ytest(ytest==0)=-1;
yval(yval==0)=-1;
%%
% evaluation d'un modele
vectC=logspace(-2,2,9) %echelle logarithmique
precision=zeros(length(vectC),1);
for i=1:1:length(vectC)
[wapp,b]=monsvmclass(xapp,yapp,vectC(i));
ypred=monsvmval(xval,wapp,b);
%f(x) et y on le meme signe ?
ind_bon=find(ypred.*yval>0);
n_bon=length(ind_bon); %nombre de valeurs bien classifies
precision(i)=n_bon/length(yval)
end
[val,pos] = max(precision)
meilleur_C=(vectC(pos))
%% SVM PENALISE
vectCC=ones(size(yapp));
precision=zeros(length(vectC));
for i=1:1:length(vectC)
for j=i:1:length(vectC)
vectCC(yapp==1)= vectC(i);
vectCC(yapp==-1)= vectC(j);
[wapp,b]=monsvmclass(xapp,yapp,vectCC);
ypred=monsvmval(xval,wapp,b);
%f(x) et y on le meme signe ?
ind_bon=find(ypred.*yval>0);
n_bon=length(ind_bon); %nombre de valeurs bien classifies
i
j
precision(i,j)=n_bon/length(yval)
end
end
[val,pos_i] = max(max(precision'));
[val,pos_j] = max(max(precision));
meilleur_CC=[vectC(pos_i) ; vectC(pos_j)]
%%
[wapp,b]=monsvmclass(xapp,yapp,meilleur_C);
ypred=monsvmval(xtest,wapp,b);
%f(x) et y on le meme signe ?
ind_bon=find(ypred.*ytest>0);
n_bon=length(ind_bon);
accuracy=n_bon/length(ytest)
error=1-accuracy
% On trouve une erreur de 9.60% avec le meilleur C (0.0316) qui est une bonne
% performance dans la realite.
%% QDA (parce qu'on est pas des pds)
%% Implementation de LDA
yapp(yapp==-1)=0;
ytest(ytest==-1)=0;
yval(yval==-1)=0;
ind1=find(yapp==1);
ind2=find(yapp==0);
n=length(yapp);
n1=length(ind1);
n2=length(ind2);
%calcul des mu
mu1_hat=mean(xapp(ind1,:))';
mu2_hat=mean(xapp(ind2,:))';
%calcul des pi
pi1_hat=n1/n;
pi2_hat=n2/n;
%calcul de la matrice de cov
C1_hat=(xapp(ind1,:)-ones(n1,1)*mu1_hat')'*(xapp(ind1,:)-ones(n1,1)*mu1_hat')./n1;
C2_hat=(xapp(ind2,:)-ones(n2,1)*mu2_hat')'*(xapp(ind2,:)-ones(n2,1)*mu2_hat')./n2;
%C1=cov(X(ind1,:))
%C2=cov(X(ind2,:))
C=(n1*C1_hat+n2*C2_hat)./n;
lamda=0.001;
C=C+lamda*eye(38,38);
% Calcul des paramtres de la fonction de dcision f
w=C\(mu1_hat-mu2_hat);
w0=log(pi1_hat/pi2_hat)-w'*(mu1_hat+mu2_hat)/2;
f=xapp*w+w0;
% Calcul de y chapeau hypothetique
Y_hat(f>0)=1;
Y_hat(f<=0)=0;
errapp=mean(yapp~=Y_hat') %erreur de classification
f = xtest*w + w0;
% Calcul de y chapeau hypothetique
Y_chap(f>0)=1;
Y_chap(f<=0)=0;
% Calcul de l'erreur
errtest = mean(Y_chap' ~= ytest)
% On a trouve un erreur d'apprentissage de 7.86 % et un erreur de test de
% 8.89%
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment