<jupyter_start><jupyter_text>Data Science Academy Big Data Real-Time Analytics com Python e Spark Capítulo 11  *********** Atenção: *********** Utilize Java JDK 1.8 ou 11 e Apache Spark 2.4.2 ****** Caso receba mensagem de erro "name 'sc' is not defined", interrompa o pyspark e apague o diretório metastore_db no mesmo diretório onde está este Jupyter notebook ******  Spark MLLib - Classificação - Naive Bayes  Descrição   Baseado no Teorema de Bayes.  Probabilidade de um Evento A = P(A) é entre 0 e 1.  A probabilidade P(A/B) = P(A intersect B ) * P (A) /P(B).  A variável target se torna o evento A.  O modelo armazena a probabilidade condicional da variável target para cada possível valor das variáveis preditoras.   Vantagens  - Rápido e simples  - Funciona bem mesmo com valores missing  - Provê probabilidades de um resultado  - Excelente com variáveis categóricas    Desvantagens  - Não funciona bem com muitas variáveis numéricas  - Espera que as variáveis preditoras sejam independentes    Aplicação  - Filtro de Spam  - Diagnóstico médico  - Classificação de documentos  Classificação de Spam https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection<jupyter_code># Imports
from pyspark.ml import Pipeline
from pyspark.ml.feature import IDF
from pyspark.ml.feature import HashingTF, Tokenizer
from pyspark.ml.classification import NaiveBayes, NaiveBayesModel
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
# Spark Session - usada quando se trabalha com Dataframes no Spark
spSession = SparkSession.builder.master("local").appName("DSA-SparkMLLib").getOrCreate()
# Carregando os dados e gerando um RDD
spamRDD = sc.textFile("data/SMSSpamCollection.csv", 2)
spamRDD.cache()
spamRDD.collect()<jupyter_output><empty_output><jupyter_text>Pré-Processamento dos Dados<jupyter_code>def TransformToVector(inputStr):
    attList = inputStr.split(",")
    smsType = 0.0 if attList[0] == "ham" else 1.0
    return [smsType, attList[1]]
spamRDD2 = spamRDD.map(TransformToVector)
spamDF = spSession.createDataFrame(spamRDD2, ["label", "message"])
spamDF.cache()
spamDF.select("label", "message").show()<jupyter_output>+-----+--------------------+
|label|             message|
+-----+--------------------+
|  0.0|Go until jurong p...|
|  0.0|Ok lar... Joking ...|
|  0.0|U dun say so earl...|
|  0.0|Nah I don't think...|
|  0.0|Even my brother i...|
|  0.0|As per your reque...|
|  0.0|I'm gonna be home...|
|  0.0|I've been searchi...|
|  0.0|I HAVE A DATE ON ...|
|  0.0|Oh k...i'm watchi...|
|  0.0|Eh u remember how...|
|  0.0|Fine if thats th...|
|  0.0|Is that seriously...|
|  0.0|I‘m going to try ...|
|  0.0|So ü pay first la...|
|  0.0|Aft i finish my l...|
|  0.0|Ffffffffff. Alrig...|
|  0.0|Just forced mysel...|
|  0.0|Lol your always s...|
|  0.0|Did you catch the...|
+-----+--------------------+
only showing top 20 rows<jupyter_text>Machine Learning<jupyter_code># Dados de Treino e de Teste
(dados_treino, dados_teste) = spamDF.randomSplit([0.7, 0.3])
dados_treino.count()
dados_teste.count()
# Divisão em palavras e aplicação do TF-IDF 
tokenizer = Tokenizer(inputCol = "message", outputCol = "words")
hashingTF = HashingTF(inputCol = tokenizer.getOutputCol(), outputCol = "tempfeatures")
idf = IDF(inputCol = hashingTF.getOutputCol(), outputCol = "features")
nbClassifier = NaiveBayes()
# Criação do Pipeline
pipeline = Pipeline(stages = [tokenizer, hashingTF, idf, nbClassifier])
# Criação do modelo com o Pipeline
modelo = pipeline.fit(dados_treino)
# Previsões nos dados de teste
previsoes = modelo.transform(dados_teste)
previsoes.select("prediction", "label").collect()
# Avaliando a acurácia
avaliador = MulticlassClassificationEvaluator(predictionCol = "prediction", labelCol = "label", metricName = "accuracy")
avaliador.evaluate(previsoes)
# Resumindo as previsões - Confusion Matrix
previsoes.groupBy("label","prediction").count().show()<jupyter_output>+-----+----------+-----+
|label|prediction|count|
+-----+----------+-----+
|  1.0|       1.0|  121|
|  0.0|       1.0|   24|
|  1.0|       0.0|    4|
|  0.0|       0.0|  114|
+-----+----------+-----+
{'fraction_non_alphanumeric': 0.16313610908205503, 'fraction_numerical': 0.0221572924275627, 'mean_word_length': 3.5695216907675196, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 11, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '650046', 'license': 'MIT', 'n_tokens_mistral': 1549, 'n_tokens_neox': 1494, 'n_words': 401, 'path': 'Apache Spark/Spark-ML/04-Cap11-Spark-MLLib-NaiveBayes.ipynb', 'repo_name': 'marxcerqueira/Spark-Real-Time-Analytics', 'size': '4107'}