0

私はこのデータセットを持っています:

Instance num 0 : 300,24,'Social worker','Computer sciences',Music,10,5,5,1,5,''
Instance num 1 : 1000,20,Student,'Computer engineering',Education,10,5,5,5,5,Sony
Instance num 2 : 450,28,'Computer support specialist',Business,Programming,10,4,1,0,4,Lenovo
Instance num 3 : 1000,20,Student,'Computer engineering','3d Design',1,1,2,1,3,Toshiba
Instance num 4 : 1000,20,Student,'Computer engineering',Programming,2,5,1,5,4,Dell
Instance num 5 : 800,16,Student,'Computer sciences',Education,8,4,3,4,4,Toshiba

SMO やその他のマルチクラス分類子を使用して分類したいので、次のコードを使用してすべての公称値を数値に変換します。

int [] indices={2,3,4,10};  // indices of nominal columns
for (int i = 0; i < indices.length; i++) {
  int attInd = indices[i];
  Attribute att = data.attribute(attInd);
  for (int n = 0; n < att.numValues(); n++) {

    data.renameAttributeValue(att, att.value(n), "" + n);
  }
}

結果は次のとおりです。

Instance num 0 : 300,24,0,0,0,10,5,5,1,5,0
Instance num 1 : 1000,20,1,1,1,10,5,5,5,5,1
Instance num 2 : 450,28,2,2,2,10,4,1,0,4,2
Instance num 3 : 1000,20,1,1,3,1,1,2,1,3,3
Instance num 4 : 1000,20,1,1,2,2,5,1,5,4,4
Instance num 5 : 800,16,1,0,1,8,4,3,4,4,3

「正規化」フィルターを適用すると、結果は次のようになります。

Instance num 0 : 0,0.666667,0,0,0,1,1,1,0.2,1,0
Instance num 1 : 1,0.333333,1,1,1,1,1,1,1,1,1
Instance num 2 : 0.214286,1,2,2,2,1,0.75,0,0,0.5,2
Instance num 3 : 1,0.333333,1,1,3,0,0,0.25,0.2,0,3
Instance num 4 : 1,0.333333,1,1,2,0.111111,1,0,1,0.5,4
Instance num 5 : 0.714286,0,1,0,1,0.777778,0.75,0.5,0.8,0.5,3

問題は、変換された列がまだ文字列の「正規化」フィルターで正規化されないことです...

何か案は?

2 番目の質問: SMO 以外のマルチクラス分類子として何を使用すればよいですか?

4

2 に答える 2

0

名義/カテゴリを浮動小数点数 (/整数) に変換してから正規化しないでください無意味です。ガベージ イン、ガベージ アウト。それらを連続した数値または数値ベクトルとして扱うと、「『工学』 + 『看護』 = 『建築』の平均」のようなナンセンスな結果が得られます。

名義/カテゴリーを扱う正しい方法は、それぞれをダミー変数に変換することです(「ダミーコーディング」または「二分法」とも呼ばれます)。職業列(または専攻、選択科目など)にKレベルがある場合、1を含む1つの対応する列を除いてどこでも0であるKまたは(K-1)バイナリ変数を作成します.Wekaのドキュメントを調べて見つけてください正しい関数呼び出し。

参照。例: SO: 名義属性のダミー コーディング (ロジスティック回帰用)

于 2015-09-25T00:07:15.093 に答える