興味をそそる質問。これに対する私の答えは 3 つの部分に分かれています。
免責事項:無料のランチはありません。したがって、実際のテスト セット ラベルでパフォーマンスを確認せずに、確実に確認することはできません。最悪の場合、問題にコンセプトのドリフトがあり、ターゲット クラスを予測できなくなります。ただし、かなり良い結果をもたらすソリューションがあります
表記について:
X
特徴は、ターゲット変数 によって示されY
、分類子は によって学習されf(X) |-> Y
ます。byの分布(少し表記を乱用X
)D1
P(X|D1)
テストセットでのクラス分布
あなたは「予測変数の分布を使用できると仮定しました (「そこから予測されるクラスの割合を確認してください」)。ただし、これは単なる指標にすぎません。私は、機械が故障することを予測するために業界で分類器を構築しています (多くのエンジニアが私の入力データを歪めようとしています.これはデータを生成するマシンの信頼性を高めています.しかし,これは問題ではありません.1つのクラスは基本的に消えます.しかし,分類器はまだ有効です. .
テストセットのターゲットラベルの分布を「修正する方法」という質問には、非常に簡単な方法があります。アイデアは、基本的に、予測されたラベルに従ってすべてのテスト インスタンスを分類し、目的のターゲット変数分布に従ってデータ ポイントを (置換して) サンプリングすることです。次に、機能の分布を確認しようとすることができますX
が、これではあまりわかりません。
歪みが問題になることはありますか? 実際、分類器は通常、測定値またはその他の統計的特性を最小化しようとするため、accuracy
可能F1
です。の分布が事前にわかっている場合は、D2
この分布でのコストを最小化するコスト関数を提供できます。これらのコストは、他の回答で述べたように、トレーニング データのリサンプリングに使用できますが、一部の学習アルゴリズムには、この情報を組み込むためのより精巧な手法もあります。
外れ値の検出
1 つの問題は、入力で何かが変更されたことを検出できるかどうかですX
。これは、間違ったデータを持っていることを示している可能性があるため、非常に重要です。たとえば、すべての次元の平均や分布など、かなり単純なテストを適用できます。ただし、これは変数間の依存関係を無視します。
次の 2 つの図では、アイリス データセットを使用しています。

データ内の何かが変更されたことを検出できる 2 つの手法が頭に浮かびます。最初の手法は、PCA 変換に依存しています。数値のみですが、カテゴリ機能にも同様のアイデアがあります。PCA を使用すると、入力データを低次元空間に変換できます。これは
通常、この変換ではまだ可逆であり、エラーが小さいPCA(X,t)=PCA([X1,...,Xn],t)=[Cond1,...,Condm]=Cond
投影です。問題を検出するために、このエラーを監視できます。エラーが増加すると、予測を信用できないと言えます。t
n<<m
PCA^1(Cond,t) = X'
MSE(X,X')
versicolor
およびからのすべてのデータに PCA を作成し、virginica
2 次元の再構成でエラーをプロットすると (すべての虹彩次元の PCA)、次のようになります。

ただし、versicolor が新しいデータである場合、結果は説得力に欠けます。

ただし、PCA (または同様のもの) は数値データに対して行われるため、オーバーヘッドをあまりかけずに適切な指示を与えることができます。
私が知っている 2 番目の手法は、いわゆるワン クラス サポート ベクター マシンに基づくものです。通常のサポート ベクター マシンは、2 つのターゲット クラスを分離しようとする分類器を構築しますY
。1 クラスのサポート ベクター マシンは、見えるデータと見えないデータを分離しようとします。分類にサポート ベクター マシンを使用する場合、この手法を使用することは非常に魅力的です。基本的に 2 つの分類が得られます。最初のものは対象データを言い、2番目のものは以前に同様のデータが見られたかどうかを言います。
1 クラスの分類器を構築し、目新しさsetosa
でvirginca
色を付けると、次のグラフが得られます。

ご覧のとおり、からのデータversicolor
は疑わしいと思われます。その場合、それは新しいクラスです。ただし、これらがvirginicaのインスタンスであると仮定すると、超平面の近くで危険なほど漂流している.
半教師あり学習とトランスダクティブ
あなたの根本的な問題を解決するために。半教師あり学習の特殊なケースであるトランスダクティブ ラーニングのアイデアは、興味深いかもしれません。半監督学習では、トレーニング セットは 2 つの部分で構成されます。ラベル付きデータとラベルなしデータ。Semi-sup-l は、このすべてのデータを使用して分類器を構築します。トランスダクティブ ラーニングは、ラベル付けされていないデータがテスト データである特殊なケースD2
です。D2
Vapnik は、「より単純な問題 [ラベルの予測]を解決したいときに、より複雑な問題 [考えられるすべてのデータの分類器を構築する] を解決しようとしないでください」という考え方を示しました。
付録
プロットの RCODE
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()