K-significa agrupación con Apache Spark

K-significa agrupación con Apache Spark

  • Inteligencia artificial
6 min de lectura Actualizado Jul 19, 2017

Puntos clave: K-significa agrupación con Apache Spark que analiza estadísticas de criminalidad para identificar estados peligrosos en EE. UU. El tutorial cubre la preparación de datos, la implementación de clustering y la visualización de resultados usando consultas SQL en un cuaderno Zeppelin.

  • Utiliza datos de criminalidad para el análisis de agrupamientos.
  • Implica código Scala para procesamiento de datos y entrenamiento de modelos.

Aquí mostramos un ejemplo sencillo de cómo utiliza agrupación de k-means. Analizaremos estadísticas de criminalidad de diferentes estados de EE. UU. para ver cuáles son más y menos peligrosas. A partir de aquí Obtén nuestros datos. Los datos son así. Las columnas son estado, grupo, tasa de homicidios, agresión, población y violación. Ya incluye una columna de grupo que eliminaremos. Eso están porque te puede agrupar los puntos de datos en tantos grupos como te quiera. Este conjunto de datos usó otro valor. También observa que la población está un valor normalizado, es decir, no está la población real. Esto lo convierte en un número a pequeña escala, que es un enfoque común en estadística. Elimina los encabezados de las columnas para poder leer los datos. Más adelante los volveremos a colocar.

crime$cluster Asesinato Asalto UrbanPop Violación
Alabama 4 13.2 236 58 21.2
Alaska 4 10 263 48 44.5
Arizona 4 8.1 294 80 31
Arkansas 3 8.8 190 50 19.5
California 4 9 276 91 40.6
Colorado 3 7.9 204 78 38.7

Debajo están el código de Scala. Lo pegamos en un cuaderno de Zeppelin porque así se hacen gráficos muy bien. (te puedes leer sobre el uso de Zeppelin con Apache Spark en una publicación anterior que escribimos aquí.) Primero tenemos nuestras importaciones normales:

    import org.apache.spark.mllib.clustering.{KMeans, KMeansModel}
import org.apache.spark.mllib.linalg.Vectors
import sqlContext.implicits._
import org.apache.spark.sql.types._

Luego Crea el archivo de datos de crímenes del archivo crime_data.csv, que copiamos a Hadoop.

    var rdd = sc.textFile("hdfs://localhost:9000/data/crime_data.csv")

Ahora, los datos enviados a un algoritmo de aprendizaje automático tienen que ser números. Así que este algoritmo convertirá una cadena en bytes y luego en un doble. Luego recorremos cada grupo de bytes y los sumamos para Haz un único número total que será el valor codificado del estado del campo de texto.

    def stoDouble (s : String): Double = {
return s.map(_.toByte.doubleValue()).reduceLeft( (x,y) => x + y)
}

Obviamente necesitamos traducir ese número de nuevo a texto para poder Ve en qué estado son tratando. Así que Haz una clase de casos. te hacer eso cuando te quiero Crea un dataframe. te Crea un dataframe cuando te quieras utiliza SQL, que están fácil de manejar.

    case class StateCode(State:String, Code:Double)
var lines = rdd.map(l => l.split(","))
var states = lines.map(l => StateCode(l(0),stoDouble(l(0)))).toDF()
states.show()
states.createOrReplaceTempView("states")

Aquí tomamos cada línea del archivo de datos de entrada y la Haz un array de dobles.

    def makeDouble (s: String): Array[Double] = {
var str = s.split(",")
var a = stoDouble(str(0))
return Array(a,str(2).toDouble,str(3).toDouble,str(4).
toDouble,str(5).toDouble)
}
var crime = rdd.map(m => makeDouble(m))

Ahora Haz un objeto llamado Vector Denso. El algoritmo de clasificación de Spark k-means requiere ese formato. Luego ejecutamos el método train para hacer que el algoritmo de aprendizaje automático agrupe los estados en grupos basados en las tasas de criminalidad y la población. Le decimos que utiliza cinco grupos. Podríamos haber dicho 10 o cualquier número. Cuanto mayor es el número de clusters, más te habrá dividido tus datos.

    val crimeVector = crime.map(a => Vectors.dense(a(0),a(1),a(2),a(3),a(4)))
val clusters = KMeans.train(crimeVector,5,10)

Ahora Crea otra clase de casos para que los resultados finales estén en un marco de datos con nombres y columnas. Aquí tenemos toda la fecha más el objeto Dense Vector, así como la predicción que Spark Haz basada en el algoritmo k-medias. Un punto a destacar aquí están que Spark no tiene problema en convertir un vector denso en una columna SQL. Fíjate que el valor de clústeres del conjunto de entrenamiento se está usado para Haz la predicción. Añadimos eso también a la clase de casos de Crimen.

    case class Crime (Code:Double, Murder:Double, Assault:Double, UrbanPop:Double,Rape:Double, PredictionVector:org.apache.spark.mllib.linalg.Vector, Prediction:Double)
val crimeClass = crimeVector.map(a => Crime(a(0), a(1), a(2), a(3), a(4), a ,clusters.predict(a))).toDF()
crimeClass.show()
crimeClass.createOrReplaceTempView("crimes")

Finalmente, tenemos que unir las dos tablas de estado y predicción porque queremos poder mostrar el nombre del estado y no el número al que lo convertimos. Fíjate en la línea %sql. En un cuaderno Zeppelin eso significa que queremos utiliza SQL. Podemos hacerlo porque en crimeClass.createOrReplaceTempView("crimes") creamos una vista temporal que podemos consultar con SQL. Cuando te utiliza %sql, Zeppelin automáticamente te da la opción de Crea diferentes gráficos.

    %sql
select state, prediction, murder, assault, rape, urbanpop from states, crimes where states.code = crimes.code order by state

Aquí mostramos la opción como una tabla. Podríamos haber hecho un gráfico circular, un gráfico de barras u otro. Como te ve, mantente alejado de Alabama porque es más peligroso que, por ejemplo, Colorado.

Estas publicaciones son mías y no representan necesariamente la posición, estrategias u opinión de BMC.

Más de Inteligencia artificial

¿Te interesa saber más de BMC?

El Brief están nuestro correo mensual sobre el mainframe y la orquestación empresarial: investigación, historias de clientes, noticias de productos, eventos.

Al registrarse para esta oferta te son confirmar que te leído y aceptado la Política de Privacidad de BMC.

Tú te has suscrito a The Brief

El Brief abarca la orquestación de mainframe y empresa—BMC AMI y Control-M—y la investigación de analistas, despliegues de clientes y eventos en ambas áreas.