Tôi đang sử dụng Weka in Scala (mặc dù cú pháp hầu như giống hệt với Java). Tôi đang cố gắng để đánh giá dữ liệu của tôi với một clusterer SimpleKMeans, nhưng clusterer sẽ không chấp nhận dữ liệu chuỗi. Tôi không muốn cụm vào dữ liệu chuỗi; Tôi chỉ muốn sử dụng nó để gắn nhãn các điểm.Weka, SimpleKMeans không thể xử lý các thuộc tính chuỗi
Đây là dữ liệu tôi đang sử dụng:
@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
Như bạn có thể thấy, đó là bản chất là một tập hợp các điểm trên một x và y phối hợp máy bay. Giá trị của bất kỳ mẫu nào là không đáng kể; đây chỉ đơn giản là một bài tập trong làm việc với Weka.
Đây là mã được đem lại cho tôi rắc rối:
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)
tôi nhận được lỗi sau trên simpleKMeans.buildClusterer(instance)
:
[UnsupportedAttributeTypeException: weka.clusterers.SimpleKMeans: Không thể xử lý các thuộc tính chuỗi]
Làm cách nào để Weka giữ lại ID trong khi thực hiện phân cụm?
Dưới đây là một vài bước khác mà tôi đã thực hiện để khắc phục sự cố này:
tôi đã sử dụng Weka Explorer và nạp dữ liệu này như một 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
này làm những gì tôi muốn nó làm trong Weka Explorer. Weka nhóm các điểm và giữ lại cột ID để xác định mỗi điểm. Tôi sẽ làm điều này trong mã của tôi, nhưng tôi đang cố gắng để làm điều này mà không tạo ra các tập tin bổ sung. Như bạn có thể thấy từ số Weka Java API, Instances
diễn giải một số java.io.Reader
chỉ dưới dạng ARFF.
Tôi cũng đã thử đoạn mã sau:
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)
này hoạt động trong mã của tôi, và hiển thị kết quả. Điều đó chứng minh rằng Weka đang làm việc nói chung, nhưng vì tôi đang xóa thuộc tính ID, tôi thực sự không thể ánh xạ các điểm được nhóm lại trên các giá trị ban đầu.
Tôi nghĩ rằng ID của bạn được chuyển đổi thành một thuộc tính danh nghĩa khi tải từ một CSV. Một điều bạn có thể thử là đặt thuộc tính ID làm thuộc tính lớp. Hoặc tự chuyển đổi nó thành một loại danh nghĩa. – Sentry
Cảm ơn @Sentry, tôi có thể xác nhận điều đó là chính xác. Tôi đã đăng một câu trả lời với những gì tôi đã học về nó. –