def doRender(self, handlerId):
     html='<div class="pd_save"><table width=100%><tr><th>Model</th><th>Accuracy</th><th>Precision</th><th>Recall</th></tr>'
     confusionHtml = '<p>Confusion Tables for each Model</p>'
     for modelName,model in Configuration.getModels():
         label= model.__class__.__name__
         labeledDataRDD, sqlTableName = Configuration.getLabeledData(self.entity)
         predictionAndLabels = model.predict(labeledDataRDD.map(lambda lp: lp.features))
         metrics = MulticlassMetrics(\
             predictionAndLabels.zip(labeledDataRDD.map(lambda lp: lp.label)).map(lambda t: (float(t[0]),float(t[1])))\
         )
         html+='<tr><td>{0}</td><td>{1:.2f}%</td><td>{2:.2f}%</td><td>{3:.2f}%</td></tr>'\
             .format(label,metrics.weightedFMeasure(beta=1.0)*100, metrics.weightedPrecision*100,metrics.weightedRecall*100 )
         displayConfusionTable = True
         if ( displayConfusionTable ):
             #get labels from RDD
             handler=training.getTrainingHandler()
             classLabels = labeledDataRDD.map(lambda t: t.label).distinct().map(lambda l: handler.getClassLabel(l)).collect()
             confusionMatrix = metrics.call("confusionMatrix")
             confusionMatrixArray = confusionMatrix.toArray()
             #labels = metrics.call("labels")
             confusionHtml += "<p>" + label + "<p>"
             confusionHtml += "<table>"
             confusionHtml+="<tr><td></td>"
             for classLabel in classLabels:
                 confusionHtml+="<td>" + str(classLabel) + "</td>"
             confusionHtml+="</tr>"
             
             for i, row in enumerate(confusionMatrixArray):
                 confusionHtml += "<tr>"
                 confusionHtml += "<td>" + classLabels[i] + "</td>"
                 for j, cell in enumerate(row):
                     confusionHtml+="<td style='text-align:center'>" + ("<b>" if (i==j) else "") +  str(cell) + ("</b>" if (i==j) else "") + "</td>"
                 confusionHtml += "</tr>"
             confusionHtml += "</table>"
         
     html+='</table></div>'
     
     if ( displayConfusionTable ):
         html+=confusionHtml
     
     self._addHTML(html)
Пример #2
0
def runModel(flight, date, departureAirport=None):
    if not Configuration.isReadyForRun():
        raise ValueError(
            "Unable to predict flight delay because no models are available. Please run configure for more details"
        )

    if departureAirport is None:
        departureAirport = "LAS"

    response = getFlightSchedule(flight, date, departureAirport)
    myLogger.debug("Schedule for flight {0} at date {1} : {2}".format(
        flight, date, response))
    if "error" in response:
        return {
            "error": "Unable to access schedule {0}".format(response["error"])
        }

    payload = {}
    appendix = response['appendix']
    payload["flightInfo"] = scheduledFlight = response["scheduledFlight"]

    def getAirportJSON(code):
        for airport in appendix["airports"]:
            if airport['fs'] == code:
                return airport

    payload["departureAirportInfo"] = departureInfo = {}
    departureInfo["airportInfo"] = depAirportJSON = getAirportJSON(
        scheduledFlight['departureAirportFsCode'])
    departureInfo["weatherForecast"] = depWeather = getWeather(
        depAirportJSON['latitude'], depAirportJSON['longitude'],
        scheduledFlight["departureTimeUTC"])

    payload["arrivalAirportInfo"] = arrivalInfo = {}
    arrivalInfo["airportInfo"] = arrAirportJSON = getAirportJSON(
        scheduledFlight['arrivalAirportFsCode'])
    arrivalInfo["weatherForecast"] = arrWeather = getWeather(
        arrAirportJSON['latitude'], arrAirportJSON['longitude'],
        scheduledFlight["arrivalTimeUTC"])

    payload["prediction"] = prediction = {}
    prediction["models"] = predictionModels = []
    #create the features vector
    features = createFeaturesVector(depWeather, arrWeather, scheduledFlight,
                                    depAirportJSON, arrAirportJSON)
    #count the predicted classes to make an overall prediction
    predictedClasses = []
    trainingHandler = getTrainingHandler()
    for modelVar, model in Configuration.getModels():
        p = model.predict(features)
        predictedClasses.append(p)
        predictionModels.append({
            "model": model.__class__.__name__,
            "prediction": trainingHandler.getClassLabel(p)
        })
    classes = Counter(predictedClasses).most_common()
    if len(classes) > 1 and classes[0][1] == classes[1][1]:
        prediction["overall"] = "Undecided: {0}/{1}".format(
            trainingHandler.getClassLabel(classes[0][0]),
            trainingHandler.getClassLabel(classes[1][0]))
    else:
        prediction["overall"] = trainingHandler.getClassLabel(classes[0][0])
    """
    payload["prediction"]={
        "overall": "Delayed between 13 and 41 minutes",
        "models":[
            {"model":"NaiveBayesModel", "prediction":"Delayed between 13 and 41 minutes"},
            {"model":"DecisionTreeModel: Delayed between 13 and 41 minutes"},
            {"model":"LogisticRegressionModel: Delayed between 13 and 41 minutes"},
            {"model":"RandomForestModel: Delayed between 13 and 41 minutes"}
        ]
    }
    """

    myLogger.debug("runModel Payload {0}".format(payload))
    try:
        saveFlightResults(payload)
    except:
        myLogger.exception("Unable to save flight results {0}".format(payload))

    return json.dumps(payload)
    #payload format
    """
def runModel(flight, date, departureAirport=None):
    if not Configuration.isReadyForRun():
        raise ValueError("Unable to predict flight delay because no models are available. Please run configure for more details")

    if departureAirport is None:
        departureAirport = "LAS"

    response = getFlightSchedule(flight, date, departureAirport)
    myLogger.debug("Schedule for flight {0} at date {1} : {2}".format(flight, date, response ))
    if "error" in response:
        return {"error": "Unable to access schedule {0}".format(response["error"])}

    payload={}
    appendix=response['appendix']
    payload["flightInfo"]=scheduledFlight=response["scheduledFlight"]

    def getAirportJSON(code):
        for airport in appendix["airports"]:
            if airport['fs'] == code:
                return airport
    
    payload["departureAirportInfo"]=departureInfo={}
    departureInfo["airportInfo"]=depAirportJSON=getAirportJSON( scheduledFlight['departureAirportFsCode'] )
    departureInfo["weatherForecast"]= depWeather = getWeather(depAirportJSON['latitude'], depAirportJSON['longitude'], scheduledFlight["departureTimeUTC"])

    payload["arrivalAirportInfo"]=arrivalInfo={}
    arrivalInfo["airportInfo"]=arrAirportJSON=getAirportJSON( scheduledFlight['arrivalAirportFsCode'] )
    arrivalInfo["weatherForecast"]= arrWeather=getWeather(arrAirportJSON['latitude'], arrAirportJSON['longitude'], scheduledFlight["arrivalTimeUTC"] )

    payload["prediction"]=prediction = {}
    prediction["models"]=predictionModels = []
    #create the features vector
    features = createFeaturesVector(depWeather, arrWeather, scheduledFlight, depAirportJSON, arrAirportJSON)
    #count the predicted classes to make an overall prediction
    predictedClasses = []
    trainingHandler = getTrainingHandler();
    for modelVar,model in Configuration.getModels():
        p = model.predict(features)
        predictedClasses.append(p)
        predictionModels.append({
            "model": model.__class__.__name__,
            "prediction": trainingHandler.getClassLabel(p)
        })
    classes = Counter(predictedClasses).most_common()
    if len(classes)>1 and classes[0][1]==classes[1][1]:
        prediction["overall"] = "Undecided: {0}/{1}".format(trainingHandler.getClassLabel(classes[0][0]), trainingHandler.getClassLabel(classes[1][0]))
    else:
        prediction["overall"] = trainingHandler.getClassLabel(classes[0][0])
    """
    payload["prediction"]={
        "overall": "Delayed between 13 and 41 minutes",
        "models":[
            {"model":"NaiveBayesModel", "prediction":"Delayed between 13 and 41 minutes"},
            {"model":"DecisionTreeModel: Delayed between 13 and 41 minutes"},
            {"model":"LogisticRegressionModel: Delayed between 13 and 41 minutes"},
            {"model":"RandomForestModel: Delayed between 13 and 41 minutes"}
        ]
    }
    """

    myLogger.debug("runModel Payload {0}".format(payload))
    try:
        saveFlightResults(payload)
    except:
        myLogger.exception("Unable to save flight results {0}".format(payload))

    return json.dumps(payload)
    #payload format
    """