私はScalaでWekaを使用しています(構文は実質的にJavaと同じですが)。SimpleKMeans Clustererを使用してデータを評価しようとしていますが、Clustererは文字列データを受け入れません。文字列データでクラスター化したくありません。ポイントにラベルを付けるために使用したいだけです。
これが私が使用しているデータです:
@relation Locations
@attribute ID string
@attribute Latitude numeric
@attribute Longitude numeric
@data
'Carnegie Mellon University', 40.443064, -79.944163
'Stanford University', 37.427539, -122.170169
'Massachusetts Institute of Technology', 42.358866, -71.093823
'University of California Berkeley', 37.872166, -122.259444
'University of Washington', 47.65601, -122.30934
'University of Illinois Urbana Champaign', 40.091022, -88.229992
'University of Southern California', 34.019372, -118.28611
'University of California San Diego', 32.881494, -117.243079
ご覧のとおり、これは基本的にx座標平面とy座標平面上の点の集まりです。パターンの値はごくわずかです。これは、Wekaを使用する際の演習にすぎません。
これが私に問題を引き起こしているコードです:
val instance = new Instances(new StringReader(wekaHeader + wekaData))
val simpleKMeans = new SimpleKMeans()
simpleKMeans.buildClusterer(instance)
val eval = new ClusterEvaluation()
eval.setClusterer(simpleKMeans)
eval.evaluateClusterer(new Instances(instance))
Logger.info(eval.clusterResultsToString)
次のエラーが発生しますsimpleKMeans.buildClusterer(instance)
:
[UnsupportedAttributeTypeException:weka.clusterers.SimpleKMeans:文字列属性を処理できません!]
クラスタリングの実行中にWekaにIDを保持させるにはどうすればよいですか?
これをトラブルシューティングするために私が取った他のいくつかのステップは次のとおりです。
Weka Explorerを使用して、このデータをCSVとしてロードしました。
ID, Latitude, Longitude
'Carnegie Mellon University', 40.443064, -79.944163
'Stanford University', 37.427539, -122.170169
'Massachusetts Institute of Technology', 42.358866, -71.093823
'University of California Berkeley', 37.872166, -122.259444
'University of Washington', 47.65601, -122.30934
'University of Illinois Urbana Champaign', 40.091022, -88.229992
'University of Southern California', 34.019372, -118.28611
'University of California San Diego', 32.881494, -117.243079
これは、WekaExplorerで実行したいことを実行します。Wekaはポイントをクラスター化し、各ポイントを識別するためにID列を保持します。私は自分のコードでこれを行いますが、追加のファイルを生成せずにこれを実行しようとしています。Weka Java APIからわかるように、はARFFとしてのみInstances
解釈されます。java.io.Reader
次のコードも試しました。
val instance = new Instances(new StringReader(wekaHeader + wekaData))
instance.deleteAttributeAt(0)
val simpleKMeans = new SimpleKMeans()
simpleKMeans.buildClusterer(instance)
val eval = new ClusterEvaluation()
eval.setClusterer(simpleKMeans)
eval.evaluateClusterer(new Instances(instance))
Logger.info(eval.clusterResultsToString)
これは私のコードで機能し、結果を表示します。これは、Wekaが一般的に機能していることを証明していますが、ID属性を削除しているため、クラスター化されたポイントを元の値に実際にマップすることはできません。