Dec 14th, 2019 [SE][Machine Learning] Så här börjar du med Elastic Maskininlärning

På Elastic, har vi utvecklat olika maskininlärningsprogram sedan 2016. Då började vi med Elastic Anomaly Detection. Vårt Anomaly Detection program matas med tidsserier och försöker att hitta avvikande datapunkter.

Fördelen med Anomaly Detection är att den inte behöver tränas med märkt data. I stället, lär den sig över tiden vad som är normalt beteende i systemet och övervakar nyankomna data för att hitta avvikelser. Den här är en typ av oövervakad maskininlärning.

Det finns många intressanta problem som inte kan lösas med sådana oövervakade tekniker och i stället behöver övervakade maskininlärningsalgoritmer. Därför har vi i år satsat mycket tid på att utveckla övervakad maskininlärningsfunktioner. I den här korta artikeln bjuder vi på en inledning i övervakad maskininlärning i Elasticsearch.

Övervakad maskininlärning

Övervakad maskininlärning kan hjälpa till att till exempel upptäcka bedrägliga banktransaktioner, förutse slutpriset av en bostadsförsäljning så snart som den har hamnat på marknaden och klassificera programvara som skadliga eller normala.

Jämfört med oövervakad inlärning, så behöver övervakad inlärning markerade data - data som innehåller exempel på önskade svar. Till exempel om du vill använda övervakad inlärning för att klassificera programvara, behövs datapunkter med exempel på program som är taggade som skadliga eller normala.

Övervakade algoritmer måste tränas

Övervakad inlärning består av två faser: träningsfasen och testfasen. Den markerade datan delas till tränings- och testingsmängden. Den föregående används för att hitta mönster i datan och den senare för att utvärdera algoritmen.

Det brukar vanligtvis göras genom att välja en viss procent slumpmässig provdata. Till exempel, kan du använda 70 % av din data för träning och 30% för testning. Vanligtvis är det bra att ha en hög procent för träning, men om du har ett väldigt stort urval av data (200 000 datapunkter eller mer) är det möjligt att få ett bra resultat även om bara en låg procent används till träning.

Under träningsfasen matar vi in träningsmängden. Då ska algoritmen lära sig mönster i träningsdatan och koda dem i en tränad modell. Denna modell ska utvärderas med hjälp av testdatan. Testdatan är markerad, så vi kan jämföra modellens klassificering med de önskade svaren och räkna ut hur många datapunkter är felklassificerade. Genom att observera hur modellen klassificerar datapunkter som den tidigare inte har sett under träningsfasen utvärderas hur bra den fungerar generellt.

Varför är man intresserad av hur bra modellen fungerar generellt? I det föregående exemplet med skadliga och normala programvaror, finns det miljoner potentiella program som kan köras på datorn, så är det praktiskt inte möjligt att träna en övervakad algoritm med träningsmängden som innehåller datapunkter av alla möjliga program. Det bästa vi kan göra är att fånga en liten del av alla potentiella program i våra markerade träningsdata och hoppas att mönstren som vi har lärt från träningsdatan också fungerar generellt. För att utvärdera precis hur bra den ska fungera generellt, kollar vi hur bra modellen har klassificerat datapunkter i testdatan.

Regression och klassificering

Det finns två kategorier av övervakad maskininlärning: regression och klassificering. Vilken kategori ett problem tillhör beror på vilken typ av önskade svar vi vill lära oss. Till exempel, om vi vill förutse ett slutpris eller andra kontinuerliga värden, måste vi använda regression. Då är vår indata en datapunkt som beskriver en bostadsförsäljning och vår utdata det slutpris (som är kontinuerliga värden) som den såldes för. Å andra sidan, om utdatan är en eller flera klasser, t.ex spam och inte spam i e-post spamfiltrering, då använder vi klassificering.

Sedan 7.5, kan vi göra både regression och klassificering med Elastic ML.

I nästa exempel, visar vi hur det ser ut för regression. Det här exemplet använder Kibana Sample Flights dataset så du kan följa med om du vill. Datan består av fiktiv information om flygresorna.

Regression

Kibana Sample Flights dataset beskriver olika saker om fiktiva flygresor t.ex destination, väderförhållande, flygtid, om en flygresa är försenad och hur många minuter den är försenad. För att bättre planera våra resor, vill vi förutse hur många minuter en framtida flygresa kommer att bli försenad. Det är ett typisk regressionsproblem.

Först, använder vi Elasticsearch REST API för att skapa ett maskininlärningsjobb. Det ser ut så här:

PUT _ml/data_frame/analytics/model-flight-delays
{
  "source": {
    "index": [
      "kibana_sample_data_flights" -- [1]
    ],
    "query": { -- [2]
      "range": {
        "DistanceKilometers": { 
          "gt": 0
        }
      }
    }
  },
  "dest": {
    "index": "df-flight-delays",  -- [3]
    "results_field": "ml" 
  },
  "analysis": {
    "regression": {
      "dependent_variable": "FlightDelayMin",  -- [4]
      "training_percent": 90  -- [5]
    }
  },
  "analyzed_fields": {
    "includes": [],
    "excludes": [    -- [6]
      "Cancelled",
      "FlightDelay",
      "FlightDelayType"
    ]
  },
  "model_memory_limit": "100mb"
}

[1] Vår tränings- och testmängd finns i samma Elasticsearch index som kallas kibana_sample_data_flights

[2] Eftersom den här datan är fiktiv, finns det några felaktiga datapunkter. För att få lite bättre resultat, måste vi first filtrera bort några datapunkter.

[3] Elasticsearch index där vi ska skriva våra resultat

[4] Värden som vi vill förutsäga. Här vi vill förutsäga hur många minuter en flygresa kommer att bli försenad

[5] Vi kan välja hur mycket av datan ska används för träning

[6] Om vi vill inte använda några Elasticsearch fält i vår regressionsanalys, kan vi filtrera bort dem genom att använda excludes

Sen, efter det, starta jobbet:

POST _ml/data_frame/analytics/model-flight-delays/_start

Du kan kolla jobbets status genom att göra så här,

GET _ml/data_frame/analytics/model-flight-delays/_stats

När jobbet är klart, ska det stå 100 i alla fält som kallas progress_percent:

{
  "count" : 1,
  "data_frame_analytics" : [
    {
      "id" : "model-flight-delays",
      "state" : "stopped",
      "progress" : [
        {
          "phase" : "reindexing",
          "progress_percent" : 100
        },
        {
          "phase" : "loading_data",
          "progress_percent" : 100
        },
        {
          "phase" : "analyzing",
          "progress_percent" : 100
        },
        {
          "phase" : "writing_results",
          "progress_percent" : 100
        }
      ]
    }
  ]
}

Efter jobbet är klart, kan vi kolla på resultatet.

GET df-flight-delays/_search

Det ska se ut så här

          ...
          "DestRegion" : "UK",
          "OriginAirportID" : "LHR",
          "DestCityName" : "London",
          "FlightDelayMin" : 66,      -- [1]
          "ml" : {
            "FlightDelayMin_prediction" : 62.527,   -- [2]
            "is_training" : false   -- [3]
          }
          ...

[1] Det sanna värdet

[2] Förutsägning

[3] En flagga som visar om datapunkten tillhör tränings- eller testmängden.

För att utvärdera vår modell, kan vi använda Evaluate API

# evaluate results - generalization error
POST _ml/data_frame/_evaluate
{
 "index": "df-flight-delays",
  "query": {
      "bool": {
        "filter": [{ "term":  { "ml.is_training": false } }] -- [1]
      }
    },
 "evaluation": {
   "regression": {
     "actual_field": "FlightDelayMin",
     "predicted_field": "ml.FlightDelayMin_prediction",
     "metrics": {  
       "r_squared": {},
       "mean_squared_error": {}                            
     }
   }
 }
}

[1] Vi är bara intresserad av hur modellen förutsäger flygförseningar för flygresor som inte finns i träningsmängden, så måste vi filtrera bort alla datapunkter som har is_training:true.

2 Likes