📄 attributeselectionpanel.java
字号:
m_SeedLab.setEnabled(m_CVBut.isSelected());
if (m_AttributeEvaluatorEditor.getValue()
instanceof AttributeTransformer) {
m_CVBut.setSelected(false);
m_CVBut.setEnabled(false);
m_CVText.setEnabled(false);
m_CVLab.setEnabled(false);
m_SeedText.setEnabled(false);
m_SeedLab.setEnabled(false);
m_TrainBut.setSelected(true);
}
}
/**
* Sets the Logger to receive informational messages
*
* @param newLog the Logger that will now get info messages
*/
public void setLog(Logger newLog) {
m_Log = newLog;
}
/**
* Tells the panel to use a new set of instances.
*
* @param inst a set of Instances
*/
public void setInstances(Instances inst) {
m_Instances = inst;
String [] attribNames = new String [m_Instances.numAttributes()];
for (int i = 0; i < attribNames.length; i++) {
String type = "";
switch (m_Instances.attribute(i).type()) {
case Attribute.NOMINAL:
type = "(Nom) ";
break;
case Attribute.NUMERIC:
type = "(Num) ";
break;
case Attribute.STRING:
type = "(Str) ";
break;
default:
type = "(???) ";
}
String attnm = m_Instances.attribute(i).name();
attribNames[i] = type + attnm;
}
m_StartBut.setEnabled(m_RunThread == null);
m_StopBut.setEnabled(m_RunThread != null);
m_ClassCombo.setModel(new DefaultComboBoxModel(attribNames));
m_ClassCombo.setSelectedIndex(attribNames.length - 1);
m_ClassCombo.setEnabled(true);
}
/**
* Starts running the currently configured attribute evaluator and
* search method. This is run in a separate thread, and will only start if
* there is no attribute selection already running. The attribute selection
* output is sent to the results history panel.
*/
protected void startAttributeSelection() {
if (m_RunThread == null) {
m_StartBut.setEnabled(false);
m_StopBut.setEnabled(true);
m_RunThread = new Thread() {
public void run() {
// Copy the current state of things
m_Log.statusMessage("Setting up...");
Instances inst = new Instances(m_Instances);
int testMode = 0;
int numFolds = 10;
int seed = 1;
int classIndex = m_ClassCombo.getSelectedIndex();
ASEvaluation evaluator =
(ASEvaluation) m_AttributeEvaluatorEditor.getValue();
ASSearch search = (ASSearch) m_AttributeSearchEditor.getValue();
StringBuffer outBuff = new StringBuffer();
String name = (new SimpleDateFormat("HH:mm:ss - "))
.format(new Date());
String sname = search.getClass().getName();
if (sname.startsWith("weka.attributeSelection.")) {
name += sname.substring("weka.attributeSelection.".length());
} else {
name += sname;
}
String ename = evaluator.getClass().getName();
if (ename.startsWith("weka.attributeSelection.")) {
name += (" + "
+ename.substring("weka.attributeSelection.".length()));
} else {
name += (" + "+ename);
}
AttributeSelection eval = null;
try {
if (m_CVBut.isSelected()) {
testMode = 1;
numFolds = Integer.parseInt(m_CVText.getText());
seed = Integer.parseInt(m_SeedText.getText());
if (numFolds <= 1) {
throw new Exception("Number of folds must be greater than 1");
}
}
inst.setClassIndex(classIndex);
// Output some header information
m_Log.logMessage("Started " + ename);
if (m_Log instanceof TaskLogger) {
((TaskLogger)m_Log).taskStarted();
}
outBuff.append("=== Run information ===\n\n");
outBuff.append("Evaluator: " + ename);
if (evaluator instanceof OptionHandler) {
String [] o = ((OptionHandler) evaluator).getOptions();
outBuff.append(" " + Utils.joinOptions(o));
}
outBuff.append("\nSearch: " + sname);
if (search instanceof OptionHandler) {
String [] o = ((OptionHandler) search).getOptions();
outBuff.append(" " + Utils.joinOptions(o));
}
outBuff.append("\n");
outBuff.append("Relation: " + inst.relationName() + '\n');
outBuff.append("Instances: " + inst.numInstances() + '\n');
outBuff.append("Attributes: " + inst.numAttributes() + '\n');
if (inst.numAttributes() < 100) {
for (int i = 0; i < inst.numAttributes(); i++) {
outBuff.append(" " + inst.attribute(i).name()
+ '\n');
}
} else {
outBuff.append(" [list of attributes omitted]\n");
}
outBuff.append("Evaluation mode: ");
switch (testMode) {
case 0: // select using all training
outBuff.append("evaluate on all training data\n");
break;
case 1: // CV mode
outBuff.append("" + numFolds + "-fold cross-validation\n");
break;
}
outBuff.append("\n");
m_History.addResult(name, outBuff);
m_History.setSingle(name);
// Do the feature selection and output the results.
m_Log.statusMessage("Doing feature selection...");
m_History.updateResult(name);
eval = new AttributeSelection();
eval.setEvaluator(evaluator);
eval.setSearch(search);
eval.setFolds(numFolds);
eval.setSeed(seed);
if (testMode == 1) {
eval.setXval(true);
}
switch (testMode) {
case 0: // select using training
m_Log.statusMessage("Evaluating on training data...");
eval.SelectAttributes(inst);
break;
case 1: // CV mode
m_Log.statusMessage("Randomizing instances...");
Random random = new Random(seed);
inst.randomize(random);
if (inst.attribute(classIndex).isNominal()) {
m_Log.statusMessage("Stratifying instances...");
inst.stratify(numFolds);
}
for (int fold = 0; fold < numFolds;fold++) {
m_Log.statusMessage("Creating splits for fold "
+ (fold + 1) + "...");
Instances train = inst.trainCV(numFolds, fold, random);
m_Log.statusMessage("Selecting attributes using all but fold "
+ (fold + 1) + "...");
eval.selectAttributesCVSplit(train);
}
break;
default:
throw new Exception("Test mode not implemented");
}
if (testMode == 0) {
outBuff.append(eval.toResultsString());
} else {
outBuff.append(eval.CVResultsString());
}
outBuff.append("\n");
m_History.updateResult(name);
m_Log.logMessage("Finished " + ename+" "+sname);
m_Log.statusMessage("OK");
} catch (Exception ex) {
m_Log.logMessage(ex.getMessage());
m_Log.statusMessage("See error log");
} finally {
if (evaluator instanceof AttributeTransformer) {
try {
Instances transformed =
((AttributeTransformer)evaluator).transformedData();
transformed.
setRelationName("AT: "+transformed.relationName());
FastVector vv = new FastVector();
vv.addElement(transformed);
m_History.addObject(name, vv);
} catch (Exception ex) {
System.err.println(ex);
ex.printStackTrace();
}
} else if (testMode == 0) {
try {
Instances reducedInst = eval.reduceDimensionality(inst);
FastVector vv = new FastVector();
vv.addElement(reducedInst);
m_History.addObject(name, vv);
} catch (Exception ex) {
ex.printStackTrace();
}
}
if (isInterrupted()) {
m_Log.logMessage("Interrupted " + ename+" "+sname);
m_Log.statusMessage("See error log");
}
m_RunThread = null;
m_StartBut.setEnabled(true);
m_StopBut.setEnabled(false);
if (m_Log instanceof TaskLogger) {
((TaskLogger)m_Log).taskFinished();
}
}
}
};
m_RunThread.setPriority(Thread.MIN_PRIORITY);
m_RunThread.start();
}
}
/**
* Stops the currently running attribute selection (if any).
*/
protected void stopAttributeSelection() {
if (m_RunThread != null) {
m_RunThread.interrupt();
// This is deprecated (and theoretically the interrupt should do).
m_RunThread.stop();
}
}
/**
* Save the named buffer to a file.
* @param name the name of the buffer to be saved.
*/
protected void saveBuffer(String name) {
StringBuffer sb = m_History.getNamedBuffer(name);
if (sb != null) {
if (m_SaveOut.save(sb)) {
m_Log.logMessage("Save succesful.");
}
}
}
/**
* Popup a visualize panel for viewing transformed data
* @param sp the Instances to display
*/
protected void visualizeTransformedData(Instances ti) {
if (ti != null) {
MatrixPanel mp = new MatrixPanel();
mp.setInstances(ti);
String plotName = ti.relationName();
final javax.swing.JFrame jf =
new javax.swing.JFrame("Weka Attribute Selection Visualize: "
+plotName);
jf.setSize(800,600);
jf.getContentPane().setLayout(new BorderLayout());
jf.getContentPane().add(mp, BorderLayout.CENTER);
jf.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
jf.dispose();
}
});
jf.setVisible(true);
}
}
/**
* Handles constructing a popup menu with visualization options
* @param name the name of the result history list entry clicked on by
* the user.
* @param x the x coordinate for popping up the menu
* @param y the y coordinate for popping up the menu
*/
protected void visualize(String name, int x, int y) {
final String selectedName = name;
JPopupMenu resultListMenu = new JPopupMenu();
JMenuItem visMainBuffer = new JMenuItem("View in main window");
if (selectedName != null) {
visMainBuffer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_History.setSingle(selectedName);
}
});
} else {
visMainBuffer.setEnabled(false);
}
resultListMenu.add(visMainBuffer);
JMenuItem visSepBuffer = new JMenuItem("View in separate window");
if (selectedName != null) {
visSepBuffer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
m_History.openFrame(selectedName);
}
});
} else {
visSepBuffer.setEnabled(false);
}
resultListMenu.add(visSepBuffer);
JMenuItem saveOutput = new JMenuItem("Save result buffer");
if (selectedName != null) {
saveOutput.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveBuffer(selectedName);
}
});
} else {
saveOutput.setEnabled(false);
}
resultListMenu.add(saveOutput);
FastVector o = null;
if (selectedName != null) {
o = (FastVector)m_History.getNamedObject(selectedName);
}
// VisualizePanel temp_vp = null;
Instances tempTransformed = null;
if (o != null) {
for (int i = 0; i < o.size(); i++) {
Object temp = o.elementAt(i);
// if (temp instanceof VisualizePanel) {
if (temp instanceof Instances) {
// temp_vp = (VisualizePanel)temp;
tempTransformed = (Instances) temp;
}
}
}
// final VisualizePanel vp = temp_vp;
final Instances ti = tempTransformed;
JMenuItem visTrans = null;
if (ti != null) {
if (ti.relationName().startsWith("AT:")) {
visTrans = new JMenuItem("Visualize transformed data");
} else {
visTrans = new JMenuItem("Visualize reduced data");
}
resultListMenu.addSeparator();
}
// JMenuItem visTrans = new JMenuItem("Visualize transformed data");
if (ti != null && visTrans != null) {
visTrans.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
visualizeTransformedData(ti);
}
});
}
if (visTrans != null) {
resultListMenu.add(visTrans);
}
resultListMenu.show(m_History.getList(), x, y);
}
/**
* Tests out the attribute selection panel from the command line.
*
* @param args may optionally contain the name of a dataset to load.
*/
public static void main(String [] args) {
try {
final javax.swing.JFrame jf =
new javax.swing.JFrame("Weka Explorer: Select attributes");
jf.getContentPane().setLayout(new BorderLayout());
final AttributeSelectionPanel sp = new AttributeSelectionPanel();
jf.getContentPane().add(sp, BorderLayout.CENTER);
weka.gui.LogPanel lp = new weka.gui.LogPanel();
sp.setLog(lp);
jf.getContentPane().add(lp, BorderLayout.SOUTH);
jf.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
jf.dispose();
System.exit(0);
}
});
jf.pack();
jf.setVisible(true);
if (args.length == 1) {
System.err.println("Loading instances from " + args[0]);
java.io.Reader r = new java.io.BufferedReader(
new java.io.FileReader(args[0]));
Instances i = new Instances(r);
sp.setInstances(i);
}
} catch (Exception ex) {
ex.printStackTrace();
System.err.println(ex.getMessage());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -