StringIndexer для String снова. Apache Spark MLlib - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь использовать некоторые алгоритмы машинного обучения с 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();

Спасибо большое, ребята !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...