파이스파크 로지스틱 회귀

Paiseupakeu Lojiseutig Hoegwi



이 PySpark 가이드에서는 사람이 뇌졸중의 영향을 받는지 여부를 예측하기 위해 로지스틱 회귀를 수행하는 방법에 대해 설명합니다. 일반적으로 뇌졸중은 사람이 흡연/음주에 중독되었을 때 발생합니다. 심장 질환 및 높은 혈중 포도당 수치(당뇨병)와 같은 다른 이유도 뇌졸중을 유발합니다. Logistic Regression Machine Learning 모델의 도움으로 샘플 데이터에서 모델의 정확도를 예측하고 표시합니다.

이 가이드에서는 먼저 접근 방식을 본 다음 데이터를 단계별로 분석하여 각 사람의 스트로크를 예측합니다.

로지스틱 회귀

'로짓 모델'이라고도 하는 로지스틱 회귀는 분류 문제에 대한 예측 분석에 사용됩니다. 이는 클래스(카테고리)를 분류하기 위해 분류에서만 작동하는 기계 학습 모델입니다. 예를 들어 시나리오에는 두 가지 범주(뇌졸중이 있는 사람과 뇌졸중이 없는 사람)가 있습니다. 모델의 가장 좋은 응용 분야는 심장병 예측, 성별 예측, 작물 수명 예측 등입니다.







단계:

1. 데이터 수집: 데이터는 예측/분석을 수행하는 데 필요합니다. 무엇보다도 CSV/XLSX 형식일 수 있습니다. spark.read.csv() 메서드를 사용하여 Spark 환경(DataFrame)에 로드할 수 있습니다.



2. 데이터 분석 : 속성/컬럼을 분석하는 것을 '데이터 분석'이라고 합니다. 클래스를 예측하는 데 도움이 되는 열을 '독립 속성'이라고 합니다. 예측으로 이어지는 열을 '종속 또는 대상 속성'이라고 합니다. 이 시나리오에서는 열 속성을 사용하여 모든 열을 표시할 수 있습니다. unique() 메서드는 고유한 값을 확인하는 데 사용됩니다.



3. 데이터 전처리: null/missing 값을 필터링하는 것을 '전처리'라고 합니다. 이 단계에서 누락된 값을 모두 제거합니다. 기계는 이진 언어만 알고 있습니다. 따라서 모든 문자열 범주는 숫자 범주 값으로 변환되어야 합니다. PySpark에서는 pyspark.ml.feature 모듈에서 사용 가능한 클래스인 'StringIndexer'를 사용하여 문자열 범주를 숫자로 변환할 수 있습니다. 내부적으로 자동으로 변환합니다. 값을 제공할 필요가 없습니다. 다음 구문을 사용할 수 있습니다.





indexer_data=StringIndexer(inputCol= 'String_Category_ColumnName' ,출력콜= 'New_Column_name' )

4. 벡터 조립: 이제 기계가 이해할 수 있는 데이터가 있습니다. 이 단계에서 모든 독립 속성은 단일 열로 벡터화되어야 합니다. 이는 VectorAssembler 클래스를 사용하여 수행할 수 있습니다. 두 개의 매개변수를 사용합니다. 첫 번째 매개변수는 독립 속성 목록을 사용하는 inputCols입니다. 두 번째 매개변수는 모든 inputCol을 이 변수로 벡터화하는 outputCol입니다.

assembler=VectorAssembler(inputCols=[열…],outputCol=vectorized_data)

5. 변환: 이제 transform() 함수를 사용하여 업데이트된 열(3단계)을 변환하여 데이터를 준비합니다.



assembler.transform(inxed_data)

6. 교육 및 테스트를 위한 데이터 준비: 이 단계에서는 데이터를 '훈련'과 '테스트'로 나눕니다. 70% 데이터를 모델 훈련용으로, 30% 데이터를 모델 테스트용으로 분할하면 더 좋을 것입니다. 이는 randomSplit() 메서드를 사용하여 달성할 수 있습니다. 두 개의 부동 소수점 값을 포함하는 목록을 사용합니다. 하나는 테스트 분할용이고 다른 하나는 기차 분할용입니다.

train_data,test_data=final_data.select([ '특징' ,target_column]).randomSplit([0.70.0.30])

7. 모델 피팅 및 평가 : 이제 Logistic Regression 모델을 맞출 차례입니다. 로지스틱 회귀 모델은 pyspark.ml.classification 모듈에서 사용할 수 있습니다. 클래스 레이블/대상 열을 사용합니다. 그 결과 rawPrediction, 확률 및 예측 열이 생성됩니다. 결과는 예측 열에 저장됩니다.

# 모델피팅

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

# 모델 평가

train_results=logistic_regression_model.evaluate(train_data).예측

8. 정확도 및 결과: 테스트 기술을 사용하여 모델 정확도를 테스트하는 마지막 단계입니다.

로지스틱 회귀 모델을 사용하여 사람이 뇌졸중의 영향을 받는지 여부를 예측하는 다음 프로젝트를 살펴보겠습니다.

뇌졸중 예측

9. 환경에 PySpark 모듈을 설치합니다. 다음은 설치 명령입니다.

핍 설치 pyspark

10. 10명의 뇌졸중 세부 정보와 관련된 10개의 레코드가 있는 PySpark DataFrame을 생성해 보겠습니다. 시연을 위해 CSV 없이 DataFrame을 생성합니다. 이 DataFrame에는 7개의 열이 있습니다. 'Gender', 'Glucose_level', 'married', 'age', 'heart_disease', 'hyper_tension'은 독립적인 속성이고 'Stroke'는 클래스 레이블 또는 종속 속성입니다. 이는 사람의 뇌졸중이 이러한 독립적인 속성에 의존한다는 것을 의미합니다.

파이스파크 가져오기

pyspark.sql에서 SparkSession 가져오기

linuxhint_spark_app = SparkSession.builder.appName( '리눅스 힌트' ).getOrCreate()

스톡 데이터 =[

{ '성별' : '여성' , '나이' : 오십 , '심장 질환' : '예' ,

'고혈압' : '예' , '기혼' : '예' , '포도당_레벨' : 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() 메서드를 사용하여 독립 열을 표시합니다.

# 독립적인 속성 표시

스트로크_df.선택(스트로크_df[ '성별' ],stroke_df[ '포도당 레벨' ],stroke_df[ '기혼' ],stroke_df[ '나이' ],stroke_df[ '심장 질환' ],stroke_df[ '고혈압' ]).보여주다()

산출:

12. 대상 속성(Stroke)에 있는 고유 값을 표시합니다.

# 대상 속성 고유 값

스트로크_df.선택(스트로크_df[ '뇌졸중' ]).distinct().show()

산출:

13. printSchema() 함수를 사용하여 모든 열의 데이터 유형을 반환합니다.

# 모든 열의 데이터 유형을 반환합니다.

stroke_df.printSchema()

산출:

4개의 열이 문자열 유형임을 알 수 있습니다. 범주형 숫자 값으로 변환해 보겠습니다.

14. “Gender”, “heart_disease”, “hyper_tension”, “married” 열의 StringIndexer를 사용하여 문자열 범주 값을 숫자 범주 값으로 변환하고 이를 Categotical_Gender, Categotical_heart_disease, Categotical_hyper_tension, Categotical_married 열에 작성해 보겠습니다. fit() 메서드를 사용하여 열을 indexed_data DataFrame에 저장합니다.

pyspark.ml.feature 가져오기 StringIndexer에서

# 문자열 범주 값을 'Gender' 열의 숫자 범주 값으로 변환합니다.

indexer_data=StringIndexer(inputCol= '성별' ,출력콜= '범주_성별' )

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

# 문자열 범주 값을 'heart_disease' 열의 숫자 범주 값으로 변환합니다.

indexer_data=StringIndexer(inputCol= '심장 질환' ,출력콜= '범주_심장_질환' )

indexed_data=indexer_data.fit(인덱스_데이터).변환(인덱스_데이터)

# 문자열 범주 값을 'hyper_tension' 열의 숫자 범주 값으로 변환합니다.

indexer_data=StringIndexer(inputCol= '고혈압' ,출력콜= '범주적_하이퍼_텐션' )

indexed_data=indexer_data.fit(인덱스_데이터).변환(인덱스_데이터)

# 'married' 열에서 문자열 범주 값을 숫자 범주 값으로 변환합니다.

indexer_data=StringIndexer(inputCol= '기혼' ,출력콜= '범주_결혼' )

indexed_data=indexer_data.fit(인덱스_데이터).변환(인덱스_데이터)

# 업데이트된 것을 표시

indexed_data.show()

산출:

15. 벡터 어셈블러를 사용하여 독립 열을 벡터로 변환합니다. 벡터 이름은 'features'입니다.

pyspark.ml.feature 가져오기 VectorAssembler에서

어셈블러= VectorAssembler(inputCols=[ '범주_성별' , '범주_심장_질환' , '범주적_하이퍼_텐션' , '범주_결혼' , '나이' ,

'포도당_수준' ], 출력 열 = '특징' )

16. transform() 함수를 사용하여 이전 데이터를 최종 DataFrame으로 변환하고 show() 함수를 사용하여 표시합니다.

산출:

17. 학습 및 테스트용 데이터를 70-30개로 분할하여 준비합니다. 'features'는 train_data에 저장되고 'Stroke'는 test_data에 저장됩니다.

# 교육 및 테스트를 위한 데이터 준비

train_data,test_data=최종.선택([ '특징' , '뇌졸중' ]).randomSplit([ 0.70 , 0.30 ])

18. 로지스틱 회귀 모델을 적합하고 평가합니다.

pyspark.ml.classification import LogisticRegression에서

# 모델피팅

logistic_regression_model=물류 회귀(labelCol= '뇌졸중' ).fit(train_data)

# 모델 평가

train_results=logistic_regression_model.evaluate(train_data).예측

train_results.show()

산출:

19. BinaryClassificationEvaluator를 사용하여 모델 정확도를 확인합니다. 모델이 100% 정확하다는 것을 알 수 있습니다.

pyspark.ml.evaluation에서 가져오기 BinaryClassificationEvaluator

# BinaryClassificationEvaluator 호출

결과 = BinaryClassificationEvaluator(rawPredictionCol= '예측' ,labelCol= '뇌졸중' )

ROC_AUC = 결과.평가(train_results)

인쇄(ROC_AUC * 100 , '% 정확성' )

결론

PySpark의 로지스틱 회귀 모델을 사용하여 실제 타일 분류 문제를 예측할 수 있습니다. null/missing 값을 제거하는 것은 모델 평가 및 정확도를 감소시키므로 중요합니다. 전처리는 기계 학습 모델을 맞추기 전에 필요한 단계입니다. 이 단계를 적절하고 정확하게 수행했는지 확인하십시오.