Я пытаюсь использовать некоторые алгоритмы машинного обучения с Spark MLlib.
У меня есть разные типы данных в CSV (Strings, float, double ...), и проблема возникает, когда я пытаюсь использовать VectorAssembler , чтобы использовать алгоритм, потому что у меня есть строки ... так Я использовал StringIndexer , и мои строки преобразуются в числовые данные, такие как:
Джон -> 1,0
Хосе -> 2,0
Виллиан -> 3,0
Есть ли способ снова преобразовать эти числовые данные в строки? Я хотел бы снова получить исходные строки ... Я видел IndexToString , но не работает.
РЕДАКТИРОВАТЬ с кодом:
В наборе данных newDF У меня есть все данные.
final VectorAssembler vectorAssembler = new VectorAssembler()
.setInputCols(new String[] { "IDPatient_index", "Temp", "SPO2Min", "SPO2Max", "BPMmin", "BPMmax",
"BPMavg", "SYS", "DIA", "EDAmin", "EDAmax", "EDAavg" })
.setOutputCol("features");
newDF.createOrReplaceTempView("tdd");
Dataset<Row> transformedDS = sparkSession.sql(
"SELECT CAST(IDPatient as String) IDPatient ,CAST(Temp as float) Temp, CAST(SPO2Min as float) SPO2Min, "
+ "CAST(SPO2Max as float) SPO2Max, CAST(BPMmin as float) BPMmin, CAST(BPMmax as float) BPMmax, CAST(BPMavg as float) BPMavg, "
+ "CAST(SYS as float) SYS, CAST(DIA as float) DIA, CAST(EDAmin as float) EDAmin, CAST(EDAmax as float) EDAmax, CAST(EDAavg as float) EDAavg "
+ "FROM tdd");
// StringIndexer
StringIndexerModel indexer = new StringIndexer().setInputCol("IDPatient").setOutputCol("IDPatient_index").fit(transformedDS);
Dataset<Row> indexed = indexer.transform(transformedDS);
indexed.createOrReplaceTempView("tdd");
// final dataset
Dataset<Row> p1 = sparkSession.sql(
"SELECT IDPatient_index, Temp, SPO2Min, SPO2Max, BPMmin, BPMmax, BPMavg, SYS, DIA, EDAmin, EDAmax, EDAavg FROM tdd");
final Dataset<Row> featuresData = vectorAssembler.transform(p1);
final StringIndexerModel labelIndexer = new StringIndexer().setInputCol("Temp").setOutputCol("indexedLabel")
.fit(featuresData);
final VectorIndexerModel featureIndexer = new VectorIndexer().setInputCol("features")
.setOutputCol("indexedFeatures").fit(featuresData);
Dataset<Row>[] splits = featuresData.randomSplit(new double[] { 0.7, 0.3 });
Dataset<Row> trainingFeaturesData = splits[0];
Dataset<Row> testFeaturesData = splits[1];
// Train a DecisionTree model.
final DecisionTreeClassifier dt = new DecisionTreeClassifier().setLabelCol("indexedLabel")
.setFeaturesCol("indexedFeatures");
final IndexToString labelConverter = new IndexToString().setInputCol("prediction")
.setOutputCol("predictedOccupancy").setLabels(labelIndexer.labels());
IndexToString back2string = new IndexToString().setInputCol("IDPatient_index").setOutputCol("IDPatientfin")
.setLabels(labelIndexer.labels());
final Pipeline pipeline = new Pipeline()
.setStages(new PipelineStage[] { labelIndexer, featureIndexer, dt, labelConverter });
final PipelineModel model = pipeline.fit(trainingFeaturesData);
final Dataset<Row> predictions = model.transform(testFeaturesData);
System.out.println("Compruebo el back a los strings");
predictions.show();
System.out.println("Example records with Predicted Temp as 0:");
predictions.select("predictedOccupancy", "Temp", "features")
.where(predictions.col("predictedOccupancy").equalTo(36.31)).show(10);
System.out.println("Example records with Predicted Temp as 1:");
predictions.select("predictedOccupancy", "Temp", "features")
.where(predictions.col("predictedOccupancy").equalTo(36.3)).show(10);
System.out.println("Example records with In-correct predictions:");
predictions.select("predictedOccupancy", "Temp", "features")
.where(predictions.col("predictedOccupancy").notEqual(predictions.col("Temp"))).show();
Спасибо большое, ребята !!!