Domanda intressante. La mia risposta su questo ha tre parti.
Disclaimer: Non c'è il pranzo libero. Quindi, non si può mai con certezza senza controllare le prestazioni sulle etichette del set di test reali. Nel peggiore dei casi hai un concetto di deriva nel tuo problema che rende impossibile prevedere la tua classe di destinazione. Tuttavia, ci sono soluzioni che possono fornire buoni risultati
per la notazione:
Le caratteristiche sono indicati con X
variabile di destinazione dal Y
e il classificatore imparato da f(X) |-> Y
.La distribuzione dei X
in D1
da P(X|D1)
(abusando notazione un po ')
distribuzione Classe Testset
You "postulato che si potrebbe utilizzare la distribuzione nelle variabili previsti (" controllare le percentuali relative alle categorie previste dal Questo però può essere solo un'indicazione: sto costruendo classificatori nell'industria per prevedere che una macchina non funzionerà (manutenzione predittiva). Ci sono molti ingegneri che cercano di rendere i miei dati in ingresso distorti, questo sta rendendo le macchine che producono i dati sono più affidabili, ma questo non è un problema, in quanto una classe scompare fondamentalmente, tuttavia i classificatori sono ancora validi
C'è un modo molto semplice sulla domanda "come risolvere" la distribuzione nelle etichette di destinazione sul set di test. L'idea sarebbe fondamentalmente classificare tutte le istanze di test in base alle etichette previste e campionare (con la sostituzione) i punti dati in base alla distribuzione della variabile target desiderata. Potresti quindi provare a controllare la distribuzione sulle funzionalità X
ma questo non ti direbbe troppo.
L'asimmetria può essere un problema? In effetti, come un classificatore può tipicamente cercare di minimizzare la misura accuracy
di F1
o qualche altra proprietà statistica. Se si conosce in anticipo la distribuzione nel D2
, è possibile fornire una funzione di costo che riduce al minimo i costi di questa distribuzione. Questi costi possono essere utilizzati per ricampionare i dati di allenamento come menzionato nell'altra risposta, tuttavia alcuni algoritmi di apprendimento hanno anche tecniche più elaborate per incorporare queste informazioni.
Outlier Detection
Una domanda è se è possibile rilevare che qualcosa è cambiato negli ingressi X
. Questo è abbastanza importante in quanto ciò può indicare che hai avuto i dati sbagliati. È possibile applicare test abbastanza semplici come ad esempio la media e la distribuzione in tutte le dimensioni. Tuttavia, questo ignora le dipendenze tra le variabili.
per i due illustrazione im utilizzando il set di dati dell'iride
Due tecniche saltano in mente che permettono di rilevare che qualcosa nei dati è cambiato. La prima tecnica si basa sulla trasformazione PCA. Solo per numeri, ma ci sono idee simili per caratteristiche categoriali. PCA ti consente di trasformare i dati di input in uno spazio dimensionale inferiore. questo è PCA(X,t)=PCA([X1,...,Xn],t)=[Cond1,...,Condm]=Cond
con una proiezione t
Dove tipicamente con n<<m
questa trasformazione è ancora reversibile tale che PCA^1(Cond,t) = X'
e l'errore MSE(X,X')
è piccolo. Per rilevare un problema, puoi monitorare questo errore e una volta aumentato puoi dire che diffidi delle tue previsioni.
Se costruisco un PCA su tutti i dati da versicolor
e virginica
e tracciare l'errore nella ricostruzione a due dimensioni (PCA su tutte le dimensioni iris) ottengo
se versicolor è i nuovi dati del i risultati sono meno convincenti.
Tuttavia, un PCA (o si dovrebbe occupare.simile) è fatto per i dati numerici comunque, quindi, può dare una buona indicazione senza troppo sovraccarico.
Una seconda tecnica di cui sono a conoscenza si basa sulle cosiddette macchine Vector Support di classe One. Dove una normale macchina vettoriale di supporto costruisce un classificatore che tenta di separare due classi target Y
. Una macchina vettoriale di supporto di una classe tenta di separare la vista da dati non visibili. L'utilizzo di queste tecniche è abbastanza interessante se si utilizza una macchina vettoriale di supporto per la classificazione. Praticamente otterresti due classificazioni. Il primo dice i dati di destinazione e il secondo se sono già stati visti dati simili.
Se io costruisco un classificatore una classe su setosa
e virginca
e colore dalla novità ottengo il seguente grafico:
Come si può vedere dai dati versicolor
sembra essere smettere di sospetto. In tal caso è una nuova classe. Tuttavia, supponendo che si tratti di casi di virginica, si stanno pericolosamente avvicinando all'iperoplano.
semi-supervisionato apprendimento e Transductive
per risolvere il tuo problema di fondo. L'idea di Transductive Learning, un caso speciale di apprendimento semi-supervisionato potrebbe essere interessante. Nell'apprendimento Semi supervision, il set di allenamento è composto da due parti. I dati etichettati e i dati non etichettati. Semi-sup-l usa tutti questi dati per costruire il classificatore. L'apprendimento transduttivo è un caso speciale in cui i dati non etichettati sono i tuoi dati di prova D2
. L'idea è stata data da Vapnik come "non cercare di risolvere un problema più complicato [la costruzione di un classificatore per tutti i dati possibili] quando si vuole risolvere un problema più semplice [predire le etichette per D2
]"
APENDIX
RCODE per i grafici
ggplot(iris)+aes(x=Petal.Width,y=Petal.Length,color=Species)+geom_point()+stat_ellipse()
library(e1071)
iris[iris$Species %in% c("virginica","setosa"),]
ocl <- svm(iris[iris$Species %in% c("virginica","setosa"),3:4],type="one-classification")
coloring <- predict(ocl,iris[,3:4],decision.values=TRUE)
ggplot(iris)+aes(x=Petal.Width,y=Petal.Length,color=coloring)+geom_point()+stat_ellipse()
ggplot(iris)+aes(x=Petal.Width,y=Petal.Length)+geom_point(color=rgb(red=0.8+0.1*attr(coloring,"decision.values"),green=rep(0,150),blue=1-(0.8+0.1*attr(coloring,"decision.values"))))
pca <- prcomp(iris[,3:4])
#pca <- prcomp(iris[iris$Species %in% c("virginica","setosa"),1:4], retx = TRUE, scale = TRUE)
pca <- prcomp(iris[iris$Species %in% c("virginica","setosa"),1:4], retx = TRUE, scale = TRUE,tol=0.2)
pca <- prcomp(iris[iris$Species %in% c("virginica","versicolor"),1:4], retx = TRUE, scale = TRUE,tol=0.4)
predicted <-predict(pca,iris[,1:4])
inverted <- t(t(predicted %*% t(pca$rotation)) * pca$scale + pca$center)
ggplot(inverted[,3:4]-iris[,3:4])+aes(x=Petal.Width,y=Petal.Length,color=iris$
Species)+geom_point()+stat_ellipse()