Je l'ai essayé. De la conclusion, j'étais très anxieux. De plus, si vous vous appelez un framework, vous pouvez écrire correctement javadoc en anglais. Ensuite, vous devez corriger correctement le code d'implémentation au lieu de corriger le manuel.
J'ai utilisé maven pour résoudre la dépendance. Après avoir créé le projet, définissez tribuo dans le fichier pom comme indiqué ci-dessous.
<dependency>
<groupId>org.tribuo</groupId>
<artifactId>tribuo-all</artifactId>
<version>4.0.0</version>
<type>pom</type>
</dependency>
Pour apprendre et évaluer le modèle de régression logistique, il est dit faites ce qui suit, alors écrivez le code suivant dans la classe java. Faire.
var trainSet = new MutableDataset<>(new LibSVMDataSource("train-data",new LabelFactory()));
var model = new LogisticRegressionTrainer().train(trainSet);
var eval = new LabelEvaluator().evaluate(new LibSVMDataSource("test-data",trainSet.getOutputFactory()));
Le nom de la classe est TribuoSample. Quoi? Nanikore?
Il s'agit de la partie constructeur de LibSVMDataSource. Il n'y a aucun constructeur qui prend un String comme argument.
Et quelle est cette interface java.nio.file.Path? Le fait que java.nio.file.Paths n'est pas une implémentation ... Est-il moderne parce qu'il a un accès statique à Path.of?
python
//Êtes-vous en train de dire que vous pouvez écrire comme ça?
var trainSet = new MutableDataset<>(new LibSVMDataSource<>(Path.of(new URL("file:train-data").getPath()),new LabelFactory()));
//Ou est-ce comme ça?
var trainSet = new MutableDataset<>(new LibSVMDataSource<>(Paths.get("train-data"),new LabelFactory()));
//Si c'est le cas, n'est-ce pas correct avec l'URL? C'est redondant.
var trainSet = new MutableDataset<>(new LibSVMDataSource<>(new URL("file:train-data"),new LabelFactory()));
Vous pouvez le corriger manuellement ou accepter String dans le corps de cette classe, mais vous devez corriger MutableDataset.class. Vous pouvez le faire comme ça pour le moment.
MutableDataset
public LibSVMDataSource(String url, OutputFactory<T> outputFactory) throws IOException {
this(null,new URL(url),outputFactory,false,false,0);
}
public LibSVMDataSource(String url, OutputFactory<T> outputFactory, boolean zeroIndexed, int maxFeatureID) throws IOException {
this(null,new URL(url),outputFactory,true,zeroIndexed,maxFeatureID);
}
Cependant, dans le traitement du constructeur, ni l'url ni le chemin ne sont vérifiés. Voici le code correspondant de MutableDataset.class.
LibSVMDataSource
private LibSVMDataSource(Path path, URL url, OutputFactory<T> outputFactory, boolean rangeSet, boolean zeroIndexed, int maxFeatureID) throws IOException {
this.outputFactory = outputFactory;
this.path = path;
this.url = url;
this.rangeSet = rangeSet;
if (rangeSet) {
this.zeroIndexed = zeroIndexed;
this.minFeatureID = zeroIndexed ? 0 : 1;
if (maxFeatureID < minFeatureID + 1) {
throw new IllegalArgumentException("maxFeatureID must be positive, found " + maxFeatureID);
}
this.maxFeatureID = maxFeatureID;
}
read();
}
Quand il s'agit de jusqu'où nous allons Dans LibSVMDataSource # read est appelé depuis le constructeur. Ci-dessous le code correspondant.
LibSVMDataSource#read
private void read() throws IOException {
int pos = 0;
ArrayList<HashMap<Integer,Double>> processedData = new ArrayList<>();
ArrayList<String> labels = new ArrayList<>();
// Idiom copied from Files.readAllLines,
// but this doesn't require keeping the whole file in RAM.
String line;
// Parse the libsvm file, ignoring malformed lines.
try (BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream(),StandardCharsets.UTF_8))) {
for (;;) {
line = r.readLine();
if (line == null) {
break;
}
pos++;
String[] fields = splitPattern.split(line);
try {
boolean valid = true;
HashMap<Integer, Double> features = new HashMap<>();
for (int i = 1; i < fields.length && valid; i++) {
int ind = fields[i].indexOf(':');
if (ind < 0) {
logger.warning(String.format("Weird line at %d", pos));
valid = false;
}
String ids = fields[i].substring(0, ind);
int id = Integer.parseInt(ids);
if ((!rangeSet) && (maxFeatureID < id)) {
maxFeatureID = id;
}
if ((!rangeSet) && (minFeatureID > id)) {
minFeatureID = id;
}
double val = Double.parseDouble(fields[i].substring(ind + 1));
Double value = features.put(id, val);
if (value != null) {
logger.warning(String.format("Repeated features at line %d", pos));
valid = false;
}
}
if (valid) {
// Store the label
labels.add(fields[0]);
// Store the features
processedData.add(features);
} else {
throw new IOException("Invalid LibSVM format file");
}
} catch (NumberFormatException ex) {
logger.warning(String.format("Weird line at %d", pos));
throw new IOException("Invalid LibSVM format file", ex);
}
}
}
Je fais url.openStream () dans l'essai. C'est juste une NumberFormatException à attraper. En regardant la description de la variable membre, une URL ou un chemin est requis.
LibSVMDataSource
// url is the store of record.
@Config(description="URL to load the data from. Either this or path must be set.")
private URL url;
@Config(description="Path to load the data from. Either this or url must be set.")
private Path path;
Je vérifie si les deux sont nuls dans LibSVMDataSource # postConfig, mais ce n'est pas bon.
LibSVMDataSource#postConfig
@Override
public void postConfig() throws IOException {
if (maxFeatureID != Integer.MIN_VALUE) {
rangeSet = true;
minFeatureID = zeroIndexed ? 0 : 1;
if (maxFeatureID < minFeatureID + 1) {
throw new IllegalArgumentException("maxFeatureID must be positive, found " + maxFeatureID);
}
}
if ((url == null) && (path == null)) {
throw new PropertyException("","path","At most one of url and path must be set.");
} else if ((url != null) && (path != null) && !path.toUri().toURL().equals(url)) {
throw new PropertyException("","path","At most one of url and path must be set");
} else if (path != null) {
// url is the store of record.
try {
url = path.toUri().toURL();
} catch (MalformedURLException e) {
throw new PropertyException(e,"","path","Path was not a valid URL");
}
}
read();
}
Si vous écrivez ce type de code, personne ne le traitera.
TribuoSample
public class TribuoSample {
/**
* @param args Arguments de la méthode principale.
*/
public static void main(String[] args) {
URL url = null;
try {
var trainSet = new MutableDataset<>(
new LibSVMDataSource<>(url, new LabelFactory()));
} catch (IOException e) {
//Bloc de capture généré automatiquement TODO
e.printStackTrace();
}
}
}
Quand vous faites cela ...
StackTrace
Exception in thread "main" java.lang.NullPointerException
at org.tribuo.datasource.LibSVMDataSource.read(LibSVMDataSource.java:204)
at org.tribuo.datasource.LibSVMDataSource.<init>(LibSVMDataSource.java:125)
at org.tribuo.datasource.LibSVMDataSource.<init>(LibSVMDataSource.java:105)
at org.project.eden.adam.TribuoSample.main(TribuoSample.java:28)
Dans ce cas, le message que vous souhaitez transmettre à l'utilisateur est "Il est essentiel que l'url ou le chemin soit défini, mais La valeur que vous avez définie pour l'URL a été définie sur null. J'aurais dû vous le dire, mais c'est une erreur inattendue ou une trace de pile est crachée et le processus s'arrête. Si c'est une application métier, c'est toujours un framework sous le nom d'oracle, donc je me demande comment est ce genre de chute. Dans le cas de path, l'objet path est accédé par le constructeur, donc c'est nullpo sur place.
C'est sa mise en œuvre
LibSVMDataSource
public LibSVMDataSource(Path path, OutputFactory<T> outputFactory) throws IOException {
this(path,path.toUri().toURL(),outputFactory,false,false,0);
}
Exécutez l'exemple comme suit.
TribuoSample
public class TribuoSample {
/**
* @param args Arguments de la méthode principale.
*/
public static void main(String[] args) {
Path path = null;
try {
var trainSet = new MutableDataset<>(
new LibSVMDataSource<>(path, new LabelFactory()));
} catch (IOException e) {
//Bloc de capture généré automatiquement TODO
//e.printStackTrace();
}
}
}
Inutile de voir le résultat, NullPointerException.
Exception in thread "main" java.lang.NullPointerException
at org.tribuo.datasource.LibSVMDataSource.<init>(LibSVMDataSource.java:97)
at org.project.eden.adam.TribuoSample.main(TribuoSample.java:28)
Je ne m'attendais pas à ce que cela se produise à partir de la première ligne de la première page du document. Exemple d'exécution sur une autre page.
Recommended Posts