Логистична регресия на PySpark

Logisticna Regresia Na Pyspark



В това ръководство на PySpark ще обсъдим как да извършим логистична регресия, за да предвидим дали дадено лице е засегнато от инсулт или не. По принцип инсултът настъпва, когато човек е пристрастен към дима/пиенето. Други причини като сърдечни заболявания и високи нива на глюкоза в кръвта (диабет) също причиняват инсулт. С помощта на модела за машинно обучение на логистична регресия ще прогнозираме и покажем точността на нашия модел върху примерните данни.

В това ръководство първо ще видим подхода и след това ще прогнозираме инсулта на всеки човек, като анализираме данните стъпка по стъпка.

Логистична регресия

Логистичната регресия, наричана още „Логит модел“, се използва в прогнозния анализ за проблеми с класификацията. Това е модел на машинно обучение, който работи само върху класификацията, за да класифицира класовете (категориите). Например, в нашия сценарий има две категории (човек, който е засегнат от инсулт, и човек, който не е засегнат от инсулт). Най-добрите приложения на модела са предсказване на сърдечни заболявания, предсказване на пола, предсказване на живота на културите и др.







стъпки:

1. Събиране на данни: Данните са необходими за извършване на прогнози/анализ. Може да бъде под формата на CSV/XLSX, наред с други. Можем да заредим това в средата на Spark (DataFrame) с помощта на метода spark.read.csv().



2. Анализ на данни : Анализирането на атрибутите/колоните е известно като „анализ на данни“. Колоните, които помагат да се предвиди класът, са известни като „независими атрибути“. Колоната, която води до прогнозиране, е известна като „зависим или целеви атрибут“. В този сценарий можем да използваме свойството columns, за да покажем всички колони. Методът distinct() се използва, за да видите уникалните стойности.



3. Предварителна обработка на данни: Филтрирането на нулевите/липсващите стойности е известно като „предварителна обработка“. Премахваме всички липсващи стойности на този етап. Машината знае само двоичния език. Така че всички категории низове трябва да бъдат преобразувани в числови категорични стойности. В PySpark можем да използваме „StringIndexer“, който е наличният клас в модула pyspark.ml.feature, за да конвертираме категориите низове в числови. Той автоматично ги преобразува вътрешно. Не е необходимо да предоставяме стойностите. Можете да използвате следния синтаксис:





indexer_data=StringIndexer(inputCol= 'Низ_Категория_Име на колона' ,outputCol= 'Ново име_на_колона' )

4. Векторно сглобяване: Сега имате данните, които машината може да разбере. На този етап всички независими атрибути трябва да бъдат векторизирани в една колона. Това може да стане с помощта на класа VectorAssembler. Той приема два параметъра: Първият параметър е inputCols, който приема списък от независими атрибути. Вторият параметър е outputCol, който векторизира всички inputCol в тази променлива.

асемблер=VectorAssembler(inputCols=[колони…],outputCol=vectorized_data)

5. Трансформация: Сега подгответе вашите данни, като трансформирате актуализираните колони (стъпка 3) с помощта на функцията transform().



асемблер.трансформация (inxed_data)

6. Подготовка на данните за обучение и тестване: На този етап разделяме данните на „обучение“ и „тестване“. Ще бъде по-добре, ако разделим 70% данни за обучение на модела и 30% данни за тестване на модела. Това може да се постигне с помощта на метода randomSplit(). Необходим е списък, който съдържа две плаващи стойности: една за тестово разделяне и друга за разделяне на влак.

train_data,test_data=final_data.select([ 'Характеристика' ,целева_колона]).randomSplit([0.70.0.30])

7. Напасване и оценка на модела : Време е да напаснем модела на логистичната регресия. Моделът на логистичната регресия е наличен в модула pyspark.ml.classification. Взема етикета на класа/целевата колона. Това води до колони rawPrediction, вероятност и прогноза. Нашите резултати се съхраняват в колоната за прогнози.

# Напасване на модела

logistic_regression_model=LogisticRegression(labelCol=target_column).fit(train_data)

# Оценка на модела

train_results=logistic_regression_model.evaluate(train_data).predictions

8. Точност и резултати: Това е последният етап, в който тестваме точността на модела, като използваме всякакви техники за тестване.

Нека да разгледаме следния проект, в който прогнозираме дали човек е засегнат от инсулт или не, използвайки модела на логистична регресия.

Прогноза за инсулт

9. Инсталирайте модула PySpark във вашата среда. Следва командата за инсталиране:

pip инсталирайте pyspark

10. Нека създадем PySpark DataFrame с 10 записа, които са свързани с подробности за щрихи на 10 лица. За демонстрация създаваме DataFrame без CSV. В този DataFrame има 7 колони. „Gender“, „Glucose_level“, „married“, „age“, „heart_disease“, „hyper_tension“ са независими атрибути, а „Stroke“ е етикетът на класа или зависим атрибут. Това означава, че ударът на човек зависи от тези независими атрибути.

импортиране на pyspark

от pyspark.sql импортирайте SparkSession

linuxhint_spark_app = SparkSession.builder.appName( „Linux Hint“ ).getOrCreate()

stoke_data =[

{ 'Пол' : 'Женски пол' , 'възраст' : петдесет , 'сърдечно заболяване' : 'да' ,

'хипертония' : 'да' , 'женен' : 'да' , „Ниво на глюкоза“ : 130 , 'Удар' : 1 },

{ 'Пол' : 'Мъжки пол' , 'възраст' : двадесет , 'сърдечно заболяване' : 'Не' ,

'хипертония' : 'да' , 'женен' : 'Не' , „Ниво на глюкоза“ : 97 , 'Удар' : 0 },

{ 'Пол' : 'Мъжки пол' , 'възраст' : 12 , 'сърдечно заболяване' : 'Не' ,

'хипертония' : 'Не' , 'женен' : 'Не' , „Ниво на глюкоза“ : 98 , 'Удар' : 0 },

{ 'Пол' : 'Женски пол' , 'възраст' : 90 , 'сърдечно заболяване' : 'Не' ,

'хипертония' : 'Не' , 'женен' : 'да' , „Ниво на глюкоза“ : 170 , 'Удар' : 1 },

{ 'Пол' : 'Мъжки пол' , 'възраст' : 43 , 'сърдечно заболяване' : 'да' ,

'хипертония' : 'да' , 'женен' : 'да' , „Ниво на глюкоза“ : 150 , 'Удар' : 1 },

{ 'Пол' : 'Женски пол' , 'възраст' : двадесет и едно , 'сърдечно заболяване' : 'Не' ,

'хипертония' : 'Не' , 'женен' : 'да' , „Ниво на глюкоза“ : 110 , 'Удар' : 0 },

{ 'Пол' : 'Женски пол' , 'възраст' : петдесет , 'сърдечно заболяване' : 'да' ,

'хипертония' : 'Не' , 'женен' : 'да' , „Ниво на глюкоза“ : 100 , 'Удар' : 0 },

{ 'Пол' : 'Мъжки пол' , 'възраст' : 3. 4 , 'сърдечно заболяване' : 'Не' ,

'хипертония' : 'да' , 'женен' : 'да' , „Ниво на глюкоза“ : 190 , 'Удар' : 1 },

{ 'Пол' : 'Мъжки пол' , 'възраст' : 10 , 'сърдечно заболяване' : 'Не' ,

'хипертония' : 'Не' , 'женен' : 'Не' , „Ниво на глюкоза“ : 90 , 'Удар' : 0 },

{ 'Пол' : 'Женски пол' , 'възраст' : 56 , 'сърдечно заболяване' : 'да' ,

'хипертония' : 'да' , 'женен' : 'да' , „Ниво на глюкоза“ : 145 , 'Удар' : 1 }

]

# създайте рамката с данни от горните данни

stroke_df = linuxhint_spark_app.createDataFrame(stoke_data)

# Действителен stoke_df

stroke_df.show()

Изход:

11. Покажете независимите колони с помощта на метода select().

# Показване на независими атрибути

stroke_df.select(stroke_df[ 'Пол' ],stroke_df[ 'Ниво_на_глюкоза' ],stroke_df[ 'женен' ],stroke_df[ 'възраст' ],stroke_df[ 'сърдечно заболяване' ],stroke_df[ 'хипертония' ]).покажи()

Изход:

12. Покажете уникалните стойности, които присъстват в целевия атрибут (Stroke).

# уникални стойности на целевия атрибут

stroke_df.select(stroke_df[ 'Удар' ]).distinct().show()

Изход:

13. Върнете типа данни на всички колони с помощта на функцията printSchema().

# Връща тип данни на всички колони.

stroke_df.printSchema()

Изход:

Виждаме, че 4 колони са от тип низ. Нека ги преобразуваме в категорични числови стойности.

14. Нека преобразуваме категоричните стойности на низа в числови категорични стойности с помощта на StringIndexer в колоните „Gender“, „heart_disease“, „hyper_tension“ и „married“ и ги запишем в колоните Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension и Categotical_married. Съхранявайте колоните в indexed_data DataFrame, като използвате метода fit().

от pyspark.ml.feature import StringIndexer

# Преобразувайте низови категорични стойности в числени категорични стойности в колоната 'Пол'.

indexer_data=StringIndexer(inputCol= 'Пол' ,outputCol= „Категоричен_пол“ )

indexed_data=indexer_data.fit(stroke_df).transform(stroke_df)

# Преобразуване на низови категорични стойности в числени категорични стойности в колоната 'heart_disease'.

indexer_data=StringIndexer(inputCol= 'сърдечно заболяване' ,outputCol= „Категорична_сърдечна_болест“ )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Преобразувайте низови категорични стойности в числени категорични стойности в колоната 'hyper_tension'.

indexer_data=StringIndexer(inputCol= 'хипертония' ,outputCol= 'Категорично_хипер_напрежение' )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Преобразувайте низови категорични стойности в числени категорични стойности в колоната 'женени'.

indexer_data=StringIndexer(inputCol= 'женен' ,outputCol= „Категорически_омъжени“ )

indexed_data=indexer_data.fit(indexed_data).transform(indexed_data)

# Показване на актуализираното

indexed_data.show()

Изход:

15. Преобразувайте независимите колони във вектор с помощта на векторния асемблер. Името на вектора е „характеристики“.

от pyspark.ml.feature import VectorAssembler

асемблер= VectorAssembler(inputCols=[ „Категоричен_пол“ , „Категорична_сърдечна_болест“ , 'Категорично_хипер_напрежение' , „Категорически_омъжени“ , 'възраст' ,

„Ниво на глюкоза“ ],outputCol= 'Характеристика' )

16. Трансформирайте предишните данни в крайна DataFrame с помощта на функцията transform() и я покажете с помощта на функцията show().

Изход:

17. Подгответе данните за обучение и тестване, като ги разделите на 70-30. „Характеристиките“ се съхраняват в train_data, а „Stroke“ се съхранява в test_data.

# Подгответе данни за обучение и тестване

train_data,test_data=final.select([ 'Характеристика' , 'Удар' ]).randomSplit([ 0,70 , 0,30 ])

18. Поставете модела на логистична регресия и го оценете.

от pyspark.ml.classification import LogisticRegression

# Напасване на модела

logistic_regression_model=Логистична регресия(labelCol= 'Удар' ).fit(данни_влак)

# Оценка на модела

train_results=logistic_regression_model.evaluate(train_data).predictions

train_results.show()

Изход:

19. Използвайте BinaryClassificationEvaluator, за да проверите точността на модела. Виждаме, че нашият модел е 100% точен.

от pyspark.ml.evaluation импортирайте BinaryClassificationEvaluator

# извикване на BinaryClassificationEvaluator

резултати = BinaryClassificationEvaluator(rawPredictionCol= 'предсказание' ,labelCol= 'Удар' )

ROC_AUC = results.evaluate(train_results)

печат (ROC_AUC * 100 , „% точност“ )

Заключение

Можете да предвидите проблема с класифицирането на реални плочки, като използвате модела на логистична регресия в PySpark. Премахването на нулевите/липсващите стойности е важно, тъй като те намаляват оценката и точността на модела. Предварителната обработка е необходима стъпка преди монтирането на модел за машинно обучение. Уверете се, че изпълнявате тази стъпка правилно и точно.