chamar o metodo getCapabilities que retorna uma instancia de Capabilities, que em outros termos, diz quais tipos de atributos e classes o metodo esta capacitado a trabalhar. /** * Method used to pre-process the data, create model objects, and set the * initial parameter vector. */ protected Instances initializeClassifier(Instances data) throws Exception { // can classifier handle the data? getCapabilities().testWithFail(data);O FAN nao precisa de cuidados especiais para o tipo de dado que representa a informacao da classe, mas precisa que os atributos sejam numericos, e ainda nao encontramos uma boa estrategia para trabalhar com atributos ausentes (campos vazios, ou dados incompletos). Dessa forma, nosso metodo getCapabilities ficou: public Capabilities getCapabilities() { Capabilities result = super.getCapabilities(); result.disableAll(); // attributes //result.enable(Capabilities.Capability.NOMINAL_ATTRIBUTES); result.enable(Capabilities.Capability.NUMERIC_ATTRIBUTES); // class result.enable(Capabilities.Capability.NOMINAL_CLASS); result.enable(Capabilities.Capability.NUMERIC_CLASS); result.enable(Capabilities.Capability.DATE_CLASS); return result; }Estamos mantendo os atributos nominais fora do escopo nesse momento, mas o WEKA possui o filtro NominalToBinary que permite a conversao de atributos nominais para numericos. Portanto, para futuras versoes, poderemos avaliar o desempenho do modelo com o uso desse filtro.O restante do nosso metodo initializeClassifier pode ser visto a seguir: protected Instances initializeClassifier(Instances data) throws Exception { // can classifier handle the data? getCapabilities().testWithFail(data); // data ana Instances result = new Instances(data); result.deleteWithMissingClass(); // verifying data normalizeFilter = new Normalize(); normalizeFilter.setScale(1d); normalizeFilter.setTranslation(0d); normalizeFilter.setInputFormat(result); result = Filter.useFilter(result, normalizeFilter); // Transform nominal attributes //m_NominalToBinary = new NominalToBinary(); //m_NominalToBinary.setInputFormat(result); //result = Filter.useFilter(result, m_NominalToBinary); // // verifying model // //... if (isReset() || this.fan == null || this.fan.getNumberOfAttributes() != m_numAttributes || this.fan.getNeuronios().size() != m_numClasses) { this.fan = new FAN(); // .... } return result; }Nessa parte os padroes sem classes sao removidos do conjunto, os atributos sao normalizados e o modelo fan e inicializado (o numero de neuronios, os conjuntos de suporte etc).Dessa forma o metodo de treinamento fica bastante simples: public void buildClassifier(Instances data) throws Exception { m_norm_data = initializeClassifier(data); if (m_norm_data == null) { return; } for (int i_epoch = 0; i_epoch < m_epoch; i_epoch++) { for (Instance m_currentInstance : m_norm_data) { if (!m_currentInstance.classIsMissing()) { training(m_currentInstance); } } }Validacao do aprendizado (teste)Tendo o modelo construido (treinado), o WEKA ira fazer uso de dois metodos para testar e apresentar as analises do treinamento, sao eles: @Override public double[] distributionForInstance(Instance m_currentInstance) throws Exception { checkForTransient(); normalizeFilter.input(m_currentInstance); m_currentInstance = normalizeFilter.output(); double[] caracPadrao = convertAttributesArray.convert(m_currentInstance.toDoubleArray(), m_currentInstance.classIndex()); classify(caracPadrao); return neuronsPower; }Observe a chamada do filtro de normalizacao, requisito para o modelo FAN. O metodo de classificacao foi modificado para preservar a forca (pertinencia) calculados a partir das caracteristicas passadas em relacao a cada neuronio, esses valores sao mantidos na matriz neuronsPower. O resultado desse metodo e utilizado pelo metodo classifyInstance (herdado de AbstractClassifier), o maior valor e considerado como a classe indicada (o mesmo resultado do metodo classify do modelo FAN).Em exemplo dos resultados obtidos no ambiente WEKA pode ser visto a seguir:=== Run information ===Scheme: weka.classifiers.functions.FANClassifier -FR 6 -FS 100 -S 0 -N 1000 -SE 50Relation: irisInstances: 150Attributes: 5 sepallength sepalwidth petallength petalwidth classTest mode: evaluate on training data=== Classifier model (full training set) ===weka.classifiers.functions.FANClassifier@76974876Time taken to build model: 3.72 seconds=== Evaluation on training set ===Time taken to test model