PySpark Opetusohjelma aloittelijoille: Opi ESIMERKKEJÄ

Ennen kuin opit PySpark, ymmärretään:

Mikä on Apache Spark?

Spark on big data -ratkaisu, joka on osoittautunut helpommaksi ja nopeammaksi kuin Hadoop MapReduce. Spark on avoimen lähdekoodin ohjelmisto, jonka UC Berkeley RAD lab on kehittänyt vuonna 2009. Siitä lähtien, kun se julkaistiin yleisölle vuonna 2010, Spark on kasvattanut suosiotaan ja sitä käytetään alalla ennennäkemättömässä mittakaavassa.

Aikakaudella Big Data, ammattilaiset tarvitsevat enemmän kuin koskaan nopeita ja luotettavia työkaluja tietojen suoratoiston käsittelyyn. Aiemmat työkalut, kuten MapReduce, olivat suosikkeja, mutta ne olivat hitaita. Tämän ongelman voittamiseksi Spark tarjoaa ratkaisun, joka on sekä nopea että yleiskäyttöinen. Tärkein ero Spark ja MapReduce on se Spark suorittaa laskelmia muistissa myöhemmin kiintolevyllä. Se mahdollistaa nopean käytön ja tietojenkäsittelyn, mikä lyhentää aikaa tunneista minuutteihin.

Mikä on PySpark?

PySpark on Apachen luoma työkalu Spark Yhteisön käyttöön Python with Spark. Se mahdollistaa työskentelyn RDD:n (Resilient Distributed Dataset) kanssa Python. Se tarjoaa myös PySpark Shell linkkiin Python Sovellusliittymät Spark ydin aloittaa Spark Asiayhteys. Spark on klusterilaskentaa toteuttava nimimoottori, kun taas PySpark is Pythonkirjaston käytettäväksi Spark.

Kuinka Spark toimii?

Spark perustuu laskennalliseen moottoriin, eli se hoitaa aikataulutus-, jakelu- ja valvontasovelluksen. Jokainen tehtävä suoritetaan useissa työkoneissa, joita kutsutaan laskentaklusteriksi. Laskentaklusteri viittaa tehtävien jakoon. Yksi kone suorittaa yhden tehtävän, kun taas toiset osallistuvat lopputulokseen eri tehtävän kautta. Lopulta kaikki tehtävät kootaan yhteen tuotoksen tuottamiseksi. The Spark admin antaa 360 asteen yleiskatsauksen erilaisista Spark Jobs.

Miten Spark Työskentele
Miten Spark Työskentele

Spark on suunniteltu toimimaan yhdessä

  • Python
  • Java
  • Scala
  • SQL

Merkittävä ominaisuus Spark on valtava määrä sisäänrakennettua kirjastoa, mukaan lukien MLlib koneoppimista varten. Spark on myös suunniteltu toimimaan Hadoop-klusterien kanssa ja voi lukea laajan tyyppisiä tiedostoja, mukaan lukien Hive-tiedot, CSV-, JSON- ja Casandra-tiedot.

Miksi käyttää Spark?

Tulevana datan harjoittajana sinun pitäisi tuntea pythonin kuuluisat kirjastot: Pandat ja scikit-learn. Nämä kaksi kirjastoa ovat mahtavia tutkia tietojoukkoja keskikokoiseen asti. Säännölliset koneoppimisprojektit rakentuvat seuraavan metodologian ympärille:

  • Lataa tiedot levylle
  • Tuo tiedot koneen muistiin
  • Käsittele/analysoi tiedot
  • Rakenna koneoppimismalli
  • Tallenna ennuste takaisin levylle

Ongelma syntyy, jos datatieteilijä haluaa käsitellä dataa, joka on liian suuri yhdelle tietokoneelle. Aikaisempina datatieteen päivinä harjoittajat ottivat näytteitä, koska koulutusta valtaviin tietokokonaisuuksiin ei aina tarvittu. Datatieteilijä löytäisi hyvän tilastollisen otoksen, tekisi ylimääräisen robustisuustarkistuksen ja keksisi erinomaisen mallin.

Tässä on kuitenkin joitain ongelmia:

  • Kuvaako tietojoukko todellista maailmaa?
  • Sisältääkö data konkreettisen esimerkin?
  • Sopiiko malli näytteenottoon?

Otetaan esimerkiksi käyttäjien suositus. Suosittelijat luottavat siihen, että he vertaavat käyttäjiä muihin käyttäjiin arvioidessaan heidän mieltymyksiään. Jos tietojenkäsittelyn asiantuntija ottaa vain osan tiedoista, ei ole olemassa joukkoa käyttäjiä, jotka ovat hyvin samankaltaisia ​​keskenään. Suosittelijat on suoritettava koko tietojoukossa tai ei ollenkaan.

Mikä on ratkaisu?

Ratkaisu on ollut ilmeinen jo pitkään, jakaa ongelma useisiin tietokoneisiin. Rinnakkaislaskentaan liittyy myös useita ongelmia. Kehittäjillä on usein vaikeuksia kirjoittaa rinnakkaiskoodia, ja heidän on lopulta ratkaistava joukko monimutkaisia ​​​​ongelmia, jotka liittyvät itse monikäsittelyyn.

Pyspark tarjoaa datatieteilijälle API:n, jota voidaan käyttää rinnakkaisten tietojen etenemisongelmien ratkaisemiseen. Pyspark hoitaa moniprosessoinnin monimutkaiset ongelmat, kuten tiedon jakamisen, koodin jakamisen ja tulosteen keräämisen työntekijöiltä koneklusterilla.

Spark voi suorittaa itsenäisesti, mutta useimmiten se toimii klusterilaskentakehyksen, kuten Hadoopin, päällä. Testauksessa ja kehityksessä datatieteilijä voi kuitenkin ajaa tehokkaasti Spark kehityslaatikoissaan tai kannettavissa tietokoneissaan ilman klusteria

• Yksi tärkeimmistä eduista Spark on rakentaa arkkitehtuuri, joka sisältää tiedon suoratoiston hallinnan, saumattomasti datakyselyt, koneoppimisen ennustamisen ja reaaliaikaisen pääsyn erilaisiin analyyseihin.

• Spark toimii läheisesti SQL-kielen eli strukturoidun datan kanssa. Se mahdollistaa tietojen kyselyn reaaliajassa.

• Datatieteilijän päätehtävänä on analysoida ja rakentaa ennakoivia malleja. Lyhyesti sanottuna datatieteilijän on osattava tiedustella tietoja käyttämällä SQL, tuottaa tilastoraportin ja käyttää koneoppimista ennusteiden tuottamiseen. Datatieteilijät käyttävät huomattavan osan ajastaan ​​tietojen puhdistamiseen, muuntamiseen ja analysointiin. Kun tietojoukko tai datatyönkulku on valmis, datatieteilijä käyttää erilaisia ​​tekniikoita löytääkseen oivalluksia ja piilotettuja malleja. Tietojen käsittelyn tulee olla kestävää ja yhtä helppoa käyttää. Spark on oikea työkalu nopeudensa ja monipuolisten API-liittymiensä ansiosta.

Tässä PySpark opetusohjelmassa opit rakentamaan luokitin Py:lläSpark esimerkkejä.

Kuinka asentaa PySpark AWS: n kanssa

- Jupyter tiimi rakentaa Docker-imagin käytettäväksi Spark tehokkaasti. Alla on vaiheet, joita voit seurata Py:n asentamisessaSpark esimerkiksi AWS:ssä.

Katso opetusohjelmamme AWS ja TensorFlow

Vaihe 1: Luo ilmentymä

Ensinnäkin sinun on luotava ilmentymä. Siirry AWS-tilillesi ja käynnistä ilmentymä. Voit kasvattaa tallennustilaa 15 grammaan ja käyttää samaa suojausryhmää kuin TensorFlow-opetusohjelmassa.

Vaihe 2: Avaa yhteys

Avaa liitäntä ja asenna telakointisäiliö. Katso lisätietoja TensorFlow with -oppaasta Satamatyöläinen. Huomaa, että sinun on oltava oikeassa työhakemistossa.

Asenna Docker suorittamalla nämä koodit:

sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo user-mod -a -G docker ec2-user
exit

Vaihe 3: Avaa yhteys uudelleen ja asenna Spark

Kun avaat yhteyden uudelleen, voit asentaa Py:n sisältävän kuvanSpark.

## Spark
docker run -v ~/work:/home/jovyan/work -d -p 8888:8888 jupyter/pyspark-notebook

## Allow preserving Jupyter notebook
sudo chown 1000 ~/work

## Install tree to see our working directory next
sudo yum install -y tree

Vaihe 4: Avoin Jupyter

Tarkista säiliö ja sen nimi

docker ps

Käynnistä telakointiasema telakointilokeilla, joita seuraa telakointiaseman nimi. Esimerkiksi docker kirjaa zealous_goldwasser

Mene selaimeesi ja käynnistä Jupyter. Osoite on http://localhost:8888/. Liitä päätteen antama salasana.

Huomautuksia: jos haluat ladata/ladata tiedoston AWS-koneellesi, voit käyttää Cyberduck-ohjelmistoa, https://cyberduck.io/.

Kuinka asentaa PySpark on Windows/Mac ja Conda

Seuraavassa on yksityiskohtainen prosessi Py:n asentamisestaSpark on Windows/Mac ja Anaconda:

Voit asentaa Spark Suositeltava käytäntö on luoda uusi conda-ympäristö paikallisella koneellasi. Tämä uusi ympäristö asennetaan Python 3.6, Spark ja kaikki riippuvuudet.

Mac-käyttäjä

cd anaconda3
touch hello-spark.yml
vi hello-spark.yml

Windows käyttäjä

cd C:\Users\Admin\Anaconda3
echo.>hello-spark.yml
notepad hello-spark.yml

Voit muokata .yml-tiedostoa. Ole varovainen sisennyksen kanssa. Kaksi välilyöntiä vaaditaan ennen -

name: hello-spark 
    dependencies:
    
    - python=3.6
    - jupyter
    - ipython
    - numpy
    - numpy-base
    - pandas
    - py4j
    - pyspark
    - pytz

Tallenna se ja luo ympäristö. Se kestää jonkin aikaa

conda env create -f hello-spark.yml

Lisätietoja sijainnista on TensorFlow-asennusohjeessa

Voit tarkistaa kaiken koneellesi asennetun ympäristön

conda env list
Activate hello-spark

Mac-käyttäjä

source activate hello-spark

Windows käyttäjä

activate hello-spark

Huomautus: Olet jo luonut erityisen TensorFlow-ympäristön TensorFlow'n opetusohjelmien suorittamista varten. On kätevämpää luoda uusi ympäristö, joka poikkeaa hello-tf:stä. Ei ole mitään järkeä ylikuormittaa hello-tf:llä Spark tai muita koneoppimiskirjastoja.

Kuvittele, että suurin osa projektistasi sisältää TensorFlow'n, mutta sinun on käytettävä sitä Spark yhdelle tietylle projektille. Voit asettaa TensorFlow-ympäristön kaikille projekteillesi ja luoda erillisen ympäristön Spark. Voit lisätä niin monta kirjastoa Spark ympäristöön haluamallasi tavalla ilman, että se häiritsee TensorFlow-ympäristöä. Kun olet valmis Spark-projektissa, voit poistaa sen vaikuttamatta TensorFlow-ympäristöön.

Jupyter

avoin Jupyter Muistikirja ja kokeile, jos PySpark toimii. Liitä uuteen muistikirjaan seuraava PySpark mallikoodi:

import pyspark
from pyspark import SparkContext
sc =SparkContext()

Jos virheilmoitus näytetään, se on todennäköistä Java ei ole asennettu koneellesi. Macissa avaa pääte ja kirjoita java -versio, jos on java-versio, varmista että se on 1.8. sisään Windows, siirry Sovellukseen ja tarkista, onko siellä a Java kansio. Jos on a Java kansio, tarkista se Java 1.8 on asennettu. Tätä kirjoittaessa PySpark ei ole yhteensopiva Java9 ja edellä.

Jos sinun on asennettava Java, sinun täytyy ajatella linkkiä ja lataa jdk-8u181-windows-x64.exe

Jupyter

Mac-käyttäjille on suositeltavaa käyttää `brew.`

brew tap caskroom/versions
brew cask install java8

Katso tämä vaihe vaiheelta opetusohjelma miten asentaa Java

Huomautuksia: Poista ympäristö tyhjentääksesi kokonaan.

 conda env remove -n hello-spark -y

Spark Tausta

SparkKonteksti on sisäinen moottori, joka mahdollistaa yhteydet klusterien kanssa. Jos haluat suorittaa leikkauksen, tarvitset a SparkAsiayhteys.

Luo SparkTausta

Ensinnäkin sinun on aloitettava a SparkAsiayhteys.

import pyspark
from pyspark import SparkContext
sc =SparkContext()

Nyt SparkKonteksti on valmis, voit luoda tietokokoelman nimeltä RDD, Resilient Distributed Dataset. RDD:n laskenta rinnastetaan automaattisesti klusterin poikki.

nums= sc.parallelize([1,2,3,4])

Pääset ensimmäiselle riville take-toiminnolla

nums.take(1)
[1]

Voit käyttää muunnoksia dataan lambda-funktiolla. PySpark alla olevassa esimerkissä palautat numeroiden neliön. Se on karttamuunnos

squared = nums.map(lambda x: x*x).collect()
for num in squared:
    print('%i ' % (num))
1 
4 
9 
16

SQLContext

Kätevämpi tapa on käyttää DataFramea. SparkKonteksti on jo asetettu, voit käyttää sitä datakehyksen luomiseen. Sinun on myös ilmoitettava SQLContext

SQLContext mahdollistaa moottorin yhdistämisen eri tietolähteisiin. Sitä käytetään toimintojen käynnistämiseen Spark sql.

from pyspark.sql import Row
from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

Nyt tässä Spark oppitunti Python, luodaan luettelo monista. Jokainen monikko sisältää ihmisten nimet ja heidän ikänsä. Tarvitaan neljä vaihetta:

Vaihe 1) Luo luettelo tuplesta tiedoilla

[('John',19),('Smith',29),('Adam',35),('Henry',50)]

Vaihe 2) Rakenna RDD

rdd = sc.parallelize(list_p)

Vaihe 3) Muunna ketjut

rdd.map(lambda x: Row(name=x[0], age=int(x[1])))

Vaihe 4) Luo DataFrame-konteksti

sqlContext.createDataFrame(ppl)
list_p = [('John',19),('Smith',29),('Adam',35),('Henry',50)]
rdd = sc.parallelize(list_p)
ppl = rdd.map(lambda x: Row(name=x[0], age=int(x[1])))
DF_ppl = sqlContext.createDataFrame(ppl)

Jos haluat käyttää kunkin ominaisuuden tyyppiä, voit käyttää printSchema()

DF_ppl.printSchema()
root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)

Koneoppimisen esimerkki Py:n kanssaSpark

Nyt kun sinulla on lyhyt käsitys Spark ja SQLContext, olet valmis rakentamaan ensimmäisen koneoppimisohjelman.

Seuraavassa on vaiheet koneoppimisohjelman luomiseksi Py:n avullaSpark:

  • Vaihe 1) Peruskäyttö Py:n kanssaSpark
  • Vaihe 2) Tietojen esikäsittely
  • Vaihe 3) Rakenna tietojenkäsittelyputki
  • Vaihe 4) Rakenna luokitin: logistiikka
  • Vaihe 5) Harjoittele ja arvioi malli
  • Vaihe 6) Viritä hyperparametri

Tässä PySpark Koneoppimisen opetusohjelmassa käytämme aikuisten tietojoukkoa. Tämän opetusohjelman tarkoituksena on oppia käyttämään Pysparkia. Lisätietoja tietojoukosta on tässä opetusohjelmassa.

Huomaa, että tietojoukko ei ole merkittävä ja saatat ajatella, että laskenta kestää kauan. Spark on suunniteltu käsittelemään huomattavaa määrää dataa. Sparksen suorituskyky paranee verrattuna muihin koneoppimiskirjastoihin, kun käsitelty tietojoukko kasvaa.

Vaihe 1) Perustoiminto Py:lläSpark

Ensinnäkin sinun on alustettava SQLContext, jota ei ole vielä aloitettu.

#from pyspark.sql import SQLContext
url = "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/adult_data.csv"
from pyspark import SparkFiles
sc.addFile(url)
sqlContext = SQLContext(sc)

sitten voit lukea cvs-tiedoston sqlContext.read.csv:llä. Käytät inferSchemaa, jonka arvo on True Spark arvaamaan automaattisesti tiedon tyypin. Oletuksena se on käännetty False.

df = sqlContext.read.csv(SparkFiles.get("adult_data.csv"), header=True, inferSchema= True)

Katsotaanpa tietotyyppiä

df.printSchema()
root
 |-- age: integer (nullable = true)
 |-- workclass: string (nullable = true)
 |-- fnlwgt: integer (nullable = true)
 |-- education: string (nullable = true)
 |-- education_num: integer (nullable = true)
 |-- marital: string (nullable = true)
 |-- occupation: string (nullable = true)
 |-- relationship: string (nullable = true)
 |-- race: string (nullable = true)
 |-- sex: string (nullable = true)
 |-- capital_gain: integer (nullable = true)
 |-- capital_loss: integer (nullable = true)
 |-- hours_week: integer (nullable = true)
 |-- native_country: string (nullable = true)
 |-- label: string (nullable = true)

Näet tiedot näytöllä.

df.show(5, truncate = False)
+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+----------+--------------+-----+
|age|workclass       |fnlwgt|education|education_num|marital           |occupation       |relationship |race |sex   |capital_gain|capital_loss|hours_week|native_country|label|
+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+----------+--------------+-----+
|39 |State-gov       |77516 |Bachelors|13           |Never-married     |Adm-clerical     |Not-in-family|White|Male  |2174        |0           |40        |United-States |<=50K|
|50 |Self-emp-not-inc|83311 |Bachelors|13           |Married-civ-spouse|Exec-managerial  |Husband      |White|Male  |0           |0           |13        |United-States |<=50K|
|38 |Private         |215646|HS-grad  |9            |Divorced          |Handlers-cleaners|Not-in-family|White|Male  |0           |0           |40        |United-States |<=50K|
|53 |Private         |234721|11th     |7            |Married-civ-spouse|Handlers-cleaners|Husband      |Black|Male  |0           |0           |40        |United-States |<=50K|
|28 |Private         |338409|Bachelors|13           |Married-civ-spouse|Prof-specialty   |Wife         |Black|Female|0           |0           |40        |Cuba          |<=50K|
+---+----------------+------+---------+-------------+------------------+-----------------+-------------+-----+------+------------+------------+----------+--------------+-----+
only showing top 5 rows

Jos et asettanut inderShemaa arvoon True, tässä on mitä tapahtuu tyypille. Ne ovat kaikki ketjussa.

df_string = sqlContext.read.csv(SparkFiles.get("adult.csv"), header=True, inferSchema=  False)
df_string.printSchema()
root
 |-- age: string (nullable = true)
 |-- workclass: string (nullable = true)
 |-- fnlwgt: string (nullable = true)
 |-- education: string (nullable = true)
 |-- education_num: string (nullable = true)
 |-- marital: string (nullable = true)
 |-- occupation: string (nullable = true)
 |-- relationship: string (nullable = true)
 |-- race: string (nullable = true)
 |-- sex: string (nullable = true)
 |-- capital_gain: string (nullable = true)
 |-- capital_loss: string (nullable = true)
 |-- hours_week: string (nullable = true)
 |-- native_country: string (nullable = true)
 |-- label: string (nullable = true)

Jos haluat muuntaa jatkuvan muuttujan oikeaan muotoon, voit käyttää sarakkeiden uudelleenlaatimista. Voit käyttää Columnilla kertomaan Spark missä sarakkeessa muunnos suoritetaan.

# Import all from `sql.types`
from pyspark.sql.types import *

# Write a custom function to convert the data type of DataFrame columns
def convertColumn(df, names, newType):
    for name in names: 
        df = df.withColumn(name, df[name].cast(newType))
    return df 
# List of continuous features
CONTI_FEATURES  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']
# Convert the type
df_string = convertColumn(df_string, CONTI_FEATURES, FloatType())
# Check the dataset
df_string.printSchema()
root
 |-- age: float (nullable = true)
 |-- workclass: string (nullable = true)
 |-- fnlwgt: float (nullable = true)
 |-- education: string (nullable = true)
 |-- education_num: float (nullable = true)
 |-- marital: string (nullable = true)
 |-- occupation: string (nullable = true)
 |-- relationship: string (nullable = true)
 |-- race: string (nullable = true)
 |-- sex: string (nullable = true)
 |-- capital_gain: float (nullable = true)
 |-- capital_loss: float (nullable = true)
 |-- hours_week: float (nullable = true)
 |-- native_country: string (nullable = true)
 |-- label: string (nullable = true)

from pyspark.ml.feature import StringIndexer
#stringIndexer = StringIndexer(inputCol="label", outputCol="newlabel")
#model = stringIndexer.fit(df)
#df = model.transform(df)
df.printSchema()

Valitse sarakkeet

Voit valita ja näyttää rivit Select- ja ominaisuuksien nimillä. Alla on valittu ikä ja fnlwgt.

df.select('age','fnlwgt').show(5)
+---+------+
|age|fnlwgt|
+---+------+
| 39| 77516|
| 50| 83311|
| 38|215646|
| 53|234721|
| 28|338409|
+---+------+
only showing top 5 rows

Laske ryhmittäin

Jos haluat laskea esiintymien lukumäärän ryhmittäin, voit ketjuttaa:

  • groupBy()
  • Kreivi()

yhdessä. PySpark alla olevassa esimerkissä lasket rivien lukumäärän koulutustason mukaan.

df.groupBy("education").count().sort("count",ascending=True).show()
+------------+-----+
|   education|count|
+------------+-----+
|   Preschool|   51|
|     1st-4th|  168|
|     5th-6th|  333|
|   Doctorate|  413|
|        12th|  433|
|         9th|  514|
| Prof-school|  576|
|     7th-8th|  646|
|        10th|  933|
|  Assoc-acdm| 1067|
|        11th| 1175|
|   Assoc-voc| 1382|
|     Masters| 1723|
|   Bachelors| 5355|
|Some-college| 7291|
|     HS-grad|10501|
+------------+-----+

Kuvaile tiedot

Saadaksesi yhteenvetotilastot tiedoista, voit käyttää description(). Se laskee:

  • laskea
  • tarkoittaa
  • keskihajonta
  • minuuttia
  • max
df.describe().show()
+-------+------------------+-----------+------------------+------------+-----------------+--------+----------------+------------+------------------+------+------------------+----------------+------------------+--------------+-----+
|summary|               age|  workclass|            fnlwgt|   education|    education_num| marital|      occupation|relationship|              race|   sex|      capital_gain|    capital_loss|        hours_week|native_country|label|
+-------+------------------+-----------+------------------+------------+-----------------+--------+----------------+------------+------------------+------+------------------+----------------+------------------+--------------+-----+
|  count|             32561|      32561|             32561|       32561|            32561|   32561|           32561|       32561|             32561| 32561|             32561|           32561|             32561|         32561|32561|
|   mean| 38.58164675532078|       null|189778.36651208502|        null| 10.0806793403151|    null|            null|        null|              null|  null|1077.6488437087312| 87.303829734959|40.437455852092995|          null| null|
| stddev|13.640432553581356|       null|105549.97769702227|        null|2.572720332067397|    null|            null|        null|              null|  null| 7385.292084840354|402.960218649002|12.347428681731838|          null| null|
|    min|                17|          ?|             12285|        10th|                1|Divorced|               ?|     Husband|Amer-Indian-Eskimo|Female|                 0|               0|                 1|             ?|<=50K|
|    max|                90|Without-pay|           1484705|Some-college|               16| Widowed|Transport-moving|        Wife|             White|  Male|             99999|            4356|                99|    Yugoslavia| >50K|
+-------+------------------+-----------+------------------+------------+-----------------+--------+----------------+------------+------------------+------+------------------+----------------+------------------+--------------+-----+

Jos haluat yhteenvetotilaston vain yhdestä sarakkeesta, lisää sarakkeen nimi description() -kohtaan.

df.describe('capital_gain').show()
+-------+------------------+
|summary|      capital_gain|
+-------+------------------+
|  count|             32561|
|   mean|1077.6488437087312|
| stddev| 7385.292084840354|
|    min|                 0|
|    max|             99999|
+-------+------------------+

Ristitaulukkolaskenta

Joskus voi olla mielenkiintoista nähdä kuvaavat tilastot kahden parikohtaisen sarakkeen välillä. Voit esimerkiksi laskea niiden ihmisten määrän, joiden tulot ovat alle tai yli 50 XNUMX koulutustason mukaan. Tätä toimintoa kutsutaan ristitaulukoksi.

df.crosstab('age', 'label').sort("age_label").show()
+---------+-----+----+
|age_label|<=50K|>50K|
+---------+-----+----+
|       17|  395|   0|
|       18|  550|   0|
|       19|  710|   2|
|       20|  753|   0|
|       21|  717|   3|
|       22|  752|  13|
|       23|  865|  12|
|       24|  767|  31|
|       25|  788|  53|
|       26|  722|  63|
|       27|  754|  81|
|       28|  748| 119|
|       29|  679| 134|
|       30|  690| 171|
|       31|  705| 183|
|       32|  639| 189|
|       33|  684| 191|
|       34|  643| 243|
|       35|  659| 217|
|       36|  635| 263|
+---------+-----+----+
only showing top 20 rows

Näet, että kenelläkään ei ole nuorina yli 50 XNUMX tuloja.

Pudota sarake

Sarakkeiden pudottamiseksi on kaksi intuitiivista sovellusliittymää:

  • drop(): Pudota sarake
  • dropna(): Pudota NA:t

Pudotat alle sarakkeen koulutus_num

df.drop('education_num').columns

['age',
 'workclass',
 'fnlwgt',
 'education',
 'marital',
 'occupation',
 'relationship',
 'race',
 'sex',
 'capital_gain',
 'capital_loss',
 'hours_week',
 'native_country',
 'label']

Suodata tiedot

Voit käyttää suodatinta () käyttääksesi kuvaavia tilastoja tietojen osajoukossa. Voit esimerkiksi laskea yli 40-vuotiaiden määrän

df.filter(df.age > 40).count()

13443

Descripttilastot ryhmittäin

Lopuksi voit ryhmitellä tiedot ryhmittäin ja laskea tilastollisia operaatioita, kuten keskiarvoa.

df.groupby('marital').agg({'capital_gain': 'mean'}).show()
+--------------------+------------------+
|             marital| avg(capital_gain)|
+--------------------+------------------+
|           Separated| 535.5687804878049|
|       Never-married|376.58831788823363|
|Married-spouse-ab...| 653.9832535885167|
|            Divorced| 728.4148098131893|
|             Widowed| 571.0715005035247|
|   Married-AF-spouse| 432.6521739130435|
|  Married-civ-spouse|1764.8595085470085|
+--------------------+------------------+

Vaihe 2) Tietojen esikäsittely

Tietojenkäsittely on kriittinen vaihe koneoppimisessa. Kun olet poistanut roskatiedot, saat tärkeitä tietoja.

Tiedät esimerkiksi, että ikä ei ole lineaarinen tulojen funktio. Kun ihmiset ovat nuoria, heidän tulonsa ovat yleensä alle keski-iän. Eläkkeelle siirtymisen jälkeen kotitalous käyttää säästönsä eli tulojen pienenemistä. Voit tallentaa tämän kuvion lisäämällä neliön ikäominaisuuteen

Lisää ikäneliö

Voit lisätä uuden ominaisuuden seuraavasti:

  1. Valitse sarake
  2. Ota muunnos käyttöön ja lisää se DataFrame-kehykseen
from pyspark.sql.functions import *

# 1 Select the column
age_square = df.select(col("age")**2)

# 2 Apply the transformation and add it to the DataFrame
df = df.withColumn("age_square", col("age")**2)

df.printSchema()
root
 |-- age: integer (nullable = true)
 |-- workclass: string (nullable = true)
 |-- fnlwgt: integer (nullable = true)
 |-- education: string (nullable = true)
 |-- education_num: integer (nullable = true)
 |-- marital: string (nullable = true)
 |-- occupation: string (nullable = true)
 |-- relationship: string (nullable = true)
 |-- race: string (nullable = true)
 |-- sex: string (nullable = true)
 |-- capital_gain: integer (nullable = true)
 |-- capital_loss: integer (nullable = true)
 |-- hours_week: integer (nullable = true)
 |-- native_country: string (nullable = true)
 |-- label: string (nullable = true)
 |-- age_square: double (nullable = true)

Voit nähdä, että age_square on lisätty tietokehykseen onnistuneesti. Voit muuttaa muuttujien järjestystä select-painikkeella. Alla tuot ikäneliön heti iän jälkeen.

COLUMNS = ['age', 'age_square', 'workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
df = df.select(COLUMNS)
df.first()
Row(age=39, age_square=1521.0, workclass='State-gov', fnlwgt=77516, education='Bachelors', education_num=13, marital='Never-married', occupation='Adm-clerical', relationship='Not-in-family', race='White', sex='Male', capital_gain=2174, capital_loss=0, hours_week=40, native_country='United-States', label='<=50K')

Sulje pois Holand-Alankomaat

Kun piirteen ryhmällä on vain yksi havainto, se ei tuo malliin tietoja. Päinvastoin, se voi johtaa virheeseen ristiinvalidoinnin aikana.

Tarkastellaan kotitalouden alkuperää

df.filter(df.native_country == 'Holand-Netherlands').count()
df.groupby('native_country').agg({'native_country': 'count'}).sort(asc("count(native_country)")).show()
+--------------------+---------------------+
|      native_country|count(native_country)|
+--------------------+---------------------+
|  Holand-Netherlands|                    1|
|            Scotland|                   12|
|             Hungary|                   13|
|            Honduras|                   13|
|Outlying-US(Guam-...|                   14|
|          Yugoslavia|                   16|
|            Thailand|                   18|
|                Laos|                   18|
|            Cambodia|                   19|
|     Trinadad&Tobago|                   19|
|                Hong|                   20|
|             Ireland|                   24|
|             Ecuador|                   28|
|              Greece|                   29|
|              France|                   29|
|                Peru|                   31|
|           Nicaragua|                   34|
|            Portugal|                   37|
|                Iran|                   43|
|               Haiti|                   44|
+--------------------+---------------------+
only showing top 20 rows

Ominaisuus native_country on vain yksi kotitalous, joka tulee Hollannista. Suljet sen pois.

df_remove = df.filter(df.native_country !=	'Holand-Netherlands')

Vaihe 3) Rakenna tietojenkäsittelyputki

Samoin kuin scikit-learnissä, Pysparkissa on pipeline API.

Liukuputki on erittäin kätevä ylläpitää tietojen rakennetta. Työnnät tiedot putkiin. Liukulinjan sisällä tehdään erilaisia ​​​​toimintoja, lähtöä käytetään algoritmin syöttämiseen.

Esimerkiksi yksi koneoppimisen universaali muunnos koostuu merkkijonon muuntamisesta yhdeksi hot-encoderiksi eli yhdeksi sarakkeeksi ryhmässä. Yksi kuuma enkooderi on yleensä matriisi, joka on täynnä nollia.

Tietojen muuntamisen vaiheet ovat hyvin samanlaisia ​​kuin scikit-learn. Sinun täytyy:

  • Indeksoi merkkijono numeerisiksi
  • Luo yksi kuuma enkooderi
  • Muunna tiedot

Kaksi API:ta hoitaa työn: StringIndexer, OneHotEncoder

  1. Ensinnäkin valitset merkkijonosarakkeen indeksoitavaksi. InputCol on tietojoukon sarakkeen nimi. outputCol on muunnetulle sarakkeelle annettu uusi nimi.
StringIndexer(inputCol="workclass", outputCol="workclass_encoded")
  1. Sovita tiedot ja muunna se
model = stringIndexer.fit(df)		
`indexed = model.transform(df)``
  1. Luo uutissarakkeet ryhmän perusteella. Jos ominaisuudessa on esimerkiksi 10 ryhmää, uudessa matriisissa on 10 saraketta, yksi jokaiselle ryhmälle.
OneHotEncoder(dropLast=False, inputCol="workclassencoded", outputCol="workclassvec")
### Example encoder
from pyspark.ml.feature import StringIndexer, OneHotEncoder, VectorAssembler

stringIndexer = StringIndexer(inputCol="workclass", outputCol="workclass_encoded")
model = stringIndexer.fit(df)
indexed = model.transform(df)
encoder = OneHotEncoder(dropLast=False, inputCol="workclass_encoded", outputCol="workclass_vec")
encoded = encoder.transform(indexed)
encoded.show(2)
+---+----------+----------------+------+---------+-------------+------------------+---------------+-------------+-----+----+------------+------------+----------+--------------+-----+-----------------+-------------+
|age|age_square|       workclass|fnlwgt|education|education_num|           marital|     occupation| relationship| race| sex|capital_gain|capital_loss|hours_week|native_country|label|workclass_encoded|workclass_vec|
+---+----------+----------------+------+---------+-------------+------------------+---------------+-------------+-----+----+------------+------------+----------+--------------+-----+-----------------+-------------+
| 39|    1521.0|       State-gov| 77516|Bachelors|           13|     Never-married|   Adm-clerical|Not-in-family|White|Male|        2174|           0|        40| United-States|<=50K|              4.0|(9,[4],[1.0])|
| 50|    2500.0|Self-emp-not-inc| 83311|Bachelors|           13|Married-civ-spouse|Exec-managerial|      Husband|White|Male|           0|           0|        13| United-States|<=50K|              1.0|(9,[1],[1.0])|
+---+----------+----------------+------+---------+-------------+------------------+---------------+-------------+-----+----+------------+------------+----------+--------------+-----+-----------------+-------------+
only showing top 2 rows

Rakenna putki

Rakennat liukuhihnan, jonka avulla voit muuntaa kaikki tarkat ominaisuudet ja lisätä ne lopulliseen tietojoukkoon. Putkilinjassa on neljä toimintoa, mutta voit lisätä niin monta toimintoa kuin haluat.

  1. Koodaa kategoriset tiedot
  2. Indeksoi tarraominaisuus
  3. Lisää jatkuva muuttuja
  4. Kokoa portaat.

Jokainen vaihe on tallennettu vaiheiksi nimettyyn luetteloon. Tämä luettelo kertoo VectorAssemblerille, minkä toiminnon sen tulee suorittaa liukuhihnan sisällä.

1. Koodaa kategoriset tiedot

Tämä vaihe on täsmälleen sama kuin yllä oleva esimerkki, paitsi että silmukat kaikkien kategoristen ominaisuuksien yli.

from pyspark.ml import Pipeline
from pyspark.ml.feature import OneHotEncoderEstimator
CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']
stages = [] # stages in our Pipeline
for categoricalCol in CATE_FEATURES:
    stringIndexer = StringIndexer(inputCol=categoricalCol, outputCol=categoricalCol + "Index")
    encoder = OneHotEncoderEstimator(inputCols=[stringIndexer.getOutputCol()],
                                     outputCols=[categoricalCol + "classVec"])
    stages += [stringIndexer, encoder]

2. Indeksoi tarraominaisuus

Spark, kuten monet muut kirjastot, ei hyväksy merkkijonoarvoja. Muunnat tarraominaisuuden StringIndexerillä ja lisäät sen listan vaiheisiin

# Convert label into label indices using the StringIndexer
label_stringIdx =  StringIndexer(inputCol="label", outputCol="newlabel")
stages += [label_stringIdx]

3. Lisää jatkuva muuttuja

VectorAssemblerin inputCols on sarakkeiden luettelo. Voit luoda uuden luettelon, joka sisältää kaikki uudet sarakkeet. Alla oleva koodi täydentää luettelon koodatuilla kategorisilla ominaisuuksilla ja jatkuvilla ominaisuuksilla.

assemblerInputs = [c + "classVec" for c in CATE_FEATURES] + CONTI_FEATURES

4. Kokoa askelmat.

Lopuksi suoritat kaikki vaiheet VectorAssemblerissä

assembler = VectorAssembler(inputCols=assemblerInputs, outputCol="features")stages += [assembler]

Nyt kun kaikki vaiheet ovat valmiit, työnnät tiedot liukuhihnaan.

# Create a Pipeline.
pipeline = Pipeline(stages=stages)
pipelineModel = pipeline.fit(df_remove)
model = pipelineModel.transform(df_remove)

Jos tarkistat uuden tietojoukon, näet, että se sisältää kaikki ominaisuudet muunnetuina ja muuntamattomina. Olet kiinnostunut vain uudesta etiketistä ja ominaisuuksista. Ominaisuudet sisältävät kaikki muunnetut ominaisuudet ja jatkuvat muuttujat.

model.take(1)

[Row(age=39, age_square=1521.0, workclass='State-gov', fnlwgt=77516, education='Bachelors', education_num=13, marital='Never-married', occupation='Adm-clerical', relationship='Not-in-family', race='White', sex='Male', capital_gain=2174, capital_loss=0, hours_week=40, native_country='United-States', label='<=50K', workclassIndex=4.0, workclassclassVec=SparseVector(8, {4: 1.0}), educationIndex=2.0, educationclassVec=SparseVector(15, {2: 1.0}), maritalIndex=1.0, maritalclassVec=SparseVector(6, {1: 1.0}), occupationIndex=3.0, occupationclassVec=SparseVector(14, {3: 1.0}), relationshipIndex=1.0, relationshipclassVec=SparseVector(5, {1: 1.0}), raceIndex=0.0, raceclassVec=SparseVector(4, {0: 1.0}), sexIndex=0.0, sexclassVec=SparseVector(1, {0: 1.0}), native_countryIndex=0.0, native_countryclassVec=SparseVector(40, {0: 1.0}), newlabel=0.0, features=SparseVector(99, {4: 1.0, 10: 1.0, 24: 1.0, 32: 1.0, 44: 1.0, 48: 1.0, 52: 1.0, 53: 1.0, 93: 39.0, 94: 77516.0, 95: 2174.0, 96: 13.0, 98: 40.0}))]

Vaihe 4) Luo luokitin: logistiikka

Laskennan nopeuttamiseksi muunnat mallin DataFrame-kehykseksi.

Sinun on valittava mallista uusi tarra ja ominaisuudet kartan avulla.

from pyspark.ml.linalg import DenseVector
input_data = model.rdd.map(lambda x: (x["newlabel"], DenseVector(x["features"])))

Olet valmis luomaan junatiedot DataFrame-kehyksenä. Käytät sqlContextia

df_train = sqlContext.createDataFrame(input_data, ["label", "features"])

Tarkista toinen rivi

df_train.show(2)
+-----+--------------------+
|label|            features|
+-----+--------------------+
|  0.0|[0.0,0.0,0.0,0.0,...|
|  0.0|[0.0,1.0,0.0,0.0,...|
+-----+--------------------+
only showing top 2 rows

Luo juna/testisarja

Jaat tietojoukon 80/20 randomSplitillä.

# Split the data into train and test sets
train_data, test_data = df_train.randomSplit([.8,.2],seed=1234)

Lasketaan kuinka monella on alle/yli 50k tulot sekä harjoittelussa että kokeessa

train_data.groupby('label').agg({'label': 'count'}).show()
+-----+------------+
|label|count(label)|
+-----+------------+
|  0.0|       19698|
|  1.0|        6263|
+-----+------------+
test_data.groupby('label').agg({'label': 'count'}).show()
+-----+------------+
|label|count(label)|
+-----+------------+
|  0.0|        5021|
|  1.0|        1578|
+-----+------------+

Rakenna logistinen regressori

Viimeisenä mutta ei vähäisimpänä, voit rakentaa luokittelun. Pysparkissa on LogiisticRegression-niminen API logistisen regression suorittamiseen.

Alustat lr:n ilmoittamalla nimisarakkeen ja ominaisuussarakkeet. Asetat enintään 10 iteraatiota ja lisäät regularisointiparametrin, jonka arvo on 0.3. Huomaa, että seuraavassa osiossa käytät ristiinvalidointia parametriruudukon kanssa mallin virittämiseen

# Import `LinearRegression`
from pyspark.ml.classification import LogisticRegression

# Initialize `lr`
lr = LogisticRegression(labelCol="label",
                        featuresCol="features",
                        maxIter=10,
                        regParam=0.3)

# Fit the data to the model
linearModel = lr.fit(train_data)

#Näet kertoimet regressiosta

# Print the coefficients and intercept for logistic regression
print("Coefficients: " + str(linearModel.coefficients))
print("Intercept: " + str(linearModel.intercept))
Coefficients: [-0.0678914665262,-0.153425526813,-0.0706009536407,-0.164057586562,-0.120655298528,0.162922330862,0.149176870438,-0.626836362611,-0.193483661541,-0.0782269980838,0.222667203836,0.399571096381,-0.0222024341804,-0.311925857859,-0.0434497788688,-0.306007744328,-0.41318209688,0.547937504247,-0.395837350854,-0.23166535958,0.618743906733,-0.344088614546,-0.385266881369,0.317324463006,-0.350518889186,-0.201335923138,-0.232878560088,-0.13349278865,-0.119760542498,0.17500602491,-0.0480968101118,0.288484253943,-0.116314616745,0.0524163478063,-0.300952624551,-0.22046421474,-0.16557996579,-0.114676231939,-0.311966431453,-0.344226119233,0.105530129507,0.152243047814,-0.292774545497,0.263628334433,-0.199951374076,-0.30329422583,-0.231087515178,0.418918551,-0.0565930184279,-0.177818073048,-0.0733236680663,-0.267972912252,0.168491215697,-0.12181255723,-0.385648075442,-0.202101794517,0.0469791640782,-0.00842850210625,-0.00373211448629,-0.259296141281,-0.309896554133,-0.168434409756,-0.11048086026,0.0280647963877,-0.204187030092,-0.414392623536,-0.252806580669,0.143366465705,-0.516359222663,-0.435627370849,-0.301949286524,0.0878249035894,-0.210951740965,-0.621417928742,-0.099445190784,-0.232671473401,-0.1077745606,-0.360429419703,-0.420362959052,-0.379729467809,-0.395186242741,0.0826401853838,-0.280251589972,0.187313505214,-0.20295228799,-0.431177064626,0.149759018379,-0.107114299614,-0.319314858424,0.0028450133235,-0.651220387649,-0.327918792207,-0.143659581445,0.00691075160413,8.38517628783e-08,2.18856717378e-05,0.0266701216268,0.000231075966823,0.00893832698698]
Intercept: -1.9884177974805692

Vaihe 5) Kouluta ja arvioi malli

Voit luoda ennusteen testisarjallesi

Voit käyttää lineaarimallia muunnoksen () kanssa test_datassa

# Make predictions on test data using the transform() method.
predictions = linearModel.transform(test_data)

Voit tulostaa elementit ennusteisiin

predictions.printSchema()
root
 |-- label: double (nullable = true)
 |-- features: vector (nullable = true)
 |-- rawPrediction: vector (nullable = true)
 |-- probability: vector (nullable = true)
 |-- prediction: double (nullable = false)

Olet kiinnostunut etiketistä, ennusteesta ja todennäköisyydestä

selected = predictions.select("label", "prediction", "probability")
selected.show(20)
+-----+----------+--------------------+
|label|prediction|         probability|
+-----+----------+--------------------+
|  0.0|       0.0|[0.91560704124179...|
|  0.0|       0.0|[0.92812140213994...|
|  0.0|       0.0|[0.92161406774159...|
|  0.0|       0.0|[0.96222760777142...|
|  0.0|       0.0|[0.66363283056957...|
|  0.0|       0.0|[0.65571324475477...|
|  0.0|       0.0|[0.73053376932829...|
|  0.0|       1.0|[0.31265053873570...|
|  0.0|       0.0|[0.80005907577390...|
|  0.0|       0.0|[0.76482251301640...|
|  0.0|       0.0|[0.84447301189069...|
|  0.0|       0.0|[0.75691912026619...|
|  0.0|       0.0|[0.60902504096722...|
|  0.0|       0.0|[0.80799228385509...|
|  0.0|       0.0|[0.87704364852567...|
|  0.0|       0.0|[0.83817652582377...|
|  0.0|       0.0|[0.79655423248500...|
|  0.0|       0.0|[0.82712311232246...|
|  0.0|       0.0|[0.81372823882016...|
|  0.0|       0.0|[0.59687710752201...|
+-----+----------+--------------------+
only showing top 20 rows

Arvioi malli

Sinun on tarkasteltava tarkkuusmittaria nähdäksesi kuinka hyvin (tai huonosti) malli toimii. Tällä hetkellä ei ole API:ta tarkkuusmitan laskemiseen Spark. Oletusarvo on ROC, vastaanottimen toimintakäyrä. Se on eri mittari, joka ottaa huomioon väärän positiivisen määrän.

Ennen kuin tarkastelet ROC:ta, rakennetaan tarkkuusmitta. Tämä mittari on sinulle tutumpi. Tarkkuusmitta on oikean ennusteen summa havaintojen kokonaismäärästä.

Luot DataFramen tunnisteella ja ennusteella.

cm = predictions.select("label", "prediction")

Voit tarkistaa luokan lukumäärän tarrasta ja ennusteesta

cm.groupby('label').agg({'label': 'count'}).show()
+-----+------------+
|label|count(label)|
+-----+------------+
|  0.0|        5021|
|  1.0|        1578|
+-----+------------+
cm.groupby('prediction').agg({'prediction': 'count'}).show()
+----------+-----------------+
|prediction|count(prediction)|
+----------+-----------------+
|       0.0|             5982|
|       1.0|              617|
+----------+-----------------+

Esimerkiksi testijoukossa on 1578 kotitaloutta, joiden tulot ovat yli 50 tk ja 5021 alle. Luokitin ennusti kuitenkin 617 kotitaloutta, joiden tulot olivat yli 50 XNUMX.

Voit laskea tarkkuuden laskemalla määrän, kun tarra on luokiteltu oikein rivien kokonaismäärään nähden.

cm.filter(cm.label == cm.prediction).count() / cm.count()

0.8237611759357478

Voit kääriä kaiken yhteen ja kirjoittaa funktion tarkkuuden laskemiseksi.

def accuracy_m(model): 
    predictions = model.transform(test_data)
    cm = predictions.select("label", "prediction")
    acc = cm.filter(cm.label == cm.prediction).count() / cm.count()
    print("Model accuracy: %.3f%%" % (acc * 100)) 
accuracy_m(model = linearModel)
Model accuracy: 82.376%

ROC-mittarit

Moduuli BinaryClassificationEvaluator sisältää ROC-mitat. Vastaanottaja Operating Ominaisuuskäyrä on toinen yleinen työkalu, jota käytetään binääriluokituksessa. Se on hyvin samanlainen kuin tarkkuus/palautuskäyrä, mutta sen sijaan, että piirrettäisiin tarkkuus vs. muistaminen, ROC-käyrä näyttää todellisen positiivisen taajuuden (eli palauttamisen) väärän positiivisen taajuuden suhteen. Väärien positiivisten tapausten osuus on virheellisesti positiivisiksi luokiteltujen negatiivisten tapausten suhde. Se on yhtä suuri kuin yksi miinus todellinen negatiivinen korko. Todellista negatiivista korkoa kutsutaan myös spesifisyydeksi. Tästä syystä ROC-käyrä kuvaa herkkyyden (muistutuksen) vs. 1 – spesifisyys

### Use ROC 
from pyspark.ml.evaluation import BinaryClassificationEvaluator

# Evaluate model
evaluator = BinaryClassificationEvaluator(rawPredictionCol="rawPrediction")
print(evaluator.evaluate(predictions))
print(evaluator.getMetricName())

0.8940481662695192alueROC:n alla

print(evaluator.evaluate(predictions))

0.8940481662695192

Vaihe 6) Viritä hyperparametri

Viimeisenä mutta ei vähäisimpänä, voit virittää hyperparametreja. Samanlainen kuin scikit oppia luot parametriruudukon ja lisäät parametrit, jotka haluat virittää.

Laskennan ajan lyhentämiseksi säädät vain säännöstelyparametria vain kahdella arvolla.

from pyspark.ml.tuning import ParamGridBuilder, CrossValidator

# Create ParamGrid for Cross Validation
paramGrid = (ParamGridBuilder()
             .addGrid(lr.regParam, [0.01, 0.5])
             .build())

Lopuksi arvioit mallin käyttämällä ristiinvalidointimenetelmää 5-kertaisella. Harjoittelu kestää noin 16 minuuttia.

from time import *
start_time = time()

# Create 5-fold CrossValidator
cv = CrossValidator(estimator=lr,
                    estimatorParamMaps=paramGrid,
                    evaluator=evaluator, numFolds=5)

# Run cross validations
cvModel = cv.fit(train_data)
# likely take a fair amount of time
end_time = time()
elapsed_time = end_time - start_time
print("Time to train model: %.3f seconds" % elapsed_time)

Aika mallin kouluttamiseen: 978.807 sekuntia

Paras regularisoinnin hyperparametri on 0.01, jonka tarkkuus on 85.316 prosenttia.

accuracy_m(model = cvModel)
Model accuracy: 85.316%

Voit purkaa suositellun parametrin ketjuttamalla cvModel.bestModel komennolla extractParamMap()

bestModel = cvModel.bestModel
bestModel.extractParamMap()
{Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='aggregationDepth', doc='suggested depth for treeAggregate (>= 2)'): 2,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='elasticNetParam', doc='the ElasticNet mixing parameter, in range [0, 1]. For alpha = 0, the penalty is an L2 penalty. For alpha = 1, it is an L1 penalty'): 0.0,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='family', doc='The name of family which is a description of the label distribution to be used in the model. Supported options: auto, binomial, multinomial.'): 'auto',
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='featuresCol', doc='features column name'): 'features',
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='fitIntercept', doc='whether to fit an intercept term'): True,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='labelCol', doc='label column name'): 'label',
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='maxIter', doc='maximum number of iterations (>= 0)'): 10,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='predictionCol', doc='prediction column name'): 'prediction',
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='probabilityCol', doc='Column name for predicted class conditional probabilities. Note: Not all models output well-calibrated probability estimates! These probabilities should be treated as confidences, not precise probabilities'): 'probability',
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='rawPredictionCol', doc='raw prediction (a.k.a. confidence) column name'): 'rawPrediction',
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='regParam', doc='regularization parameter (>= 0)'): 0.01,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='standardization', doc='whether to standardize the training features before fitting the model'): True,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='threshold', doc='threshold in binary classification prediction, in range [0, 1]'): 0.5,
 Param(parent='LogisticRegression_4d8f8ce4d6a02d8c29a0', name='tol', doc='the convergence tolerance for iterative algorithms (>= 0)'): 1e-06}

Yhteenveto

Spark on datatieteilijän perustyökalu. Sen avulla lääkäri voi yhdistää sovelluksen eri tietolähteisiin, suorittaa data-analyysin saumattomasti tai lisätä ennakoivan mallin.

Aluksi Spark, sinun on aloitettava a Spark Konteksti kanssa:

"Sparkkonteksti()'

Ja ja SQL konteksti yhteyden muodostamiseksi tietolähteeseen:

'SQLContext()'

Opetusohjelmassa opit harjoittelemaan logistista regressiota:

  1. Muunna tietojoukko tietokehykseksi:
rdd.map(lambda x: (x["newlabel"], DenseVector(x["features"])))
sqlContext.createDataFrame(input_data, ["label", "features"])

Huomaa, että tunnisteen sarakkeen nimi on newlabel ja kaikki ominaisuudet on koottu ominaisuuksiin. Muuta näitä arvoja, jos ne ovat erilaisia ​​tietojoukossasi.

  1. Luo juna/testisarja
randomSplit([.8,.2],seed=1234)
  1. Harjoittele mallia
LogisticRegression(labelCol="label",featuresCol="features",maxIter=10, regParam=0.3)
lr.fit()
  1. Tee ennustus
linearModel.transform()