캠퍼스 모집: 로지스틱 회귀의 분류 문제

캠퍼스 모집: 로지스틱 회귀의 분류 문제

소스 노드 : 1996810

개요

이 프로젝트에서는 인도의 데이터에 중점을 둘 것입니다. 그리고 우리의 목표는 예측 모델로지스틱 회귀 분석 등을 통해 후보자의 특성을 제공하면 모델이 채용 여부를 예측할 수 있습니다.

XNUMXD덴탈의 데이터 세트 인도 비즈니스 스쿨 배치 시즌을 중심으로 진행됩니다. 데이터 세트에는 경력, 시험 비율 등 후보자에 대한 다양한 요소가 포함되어 있습니다. 마지막으로 채용 상태 및 보상 세부 정보가 포함되어 있습니다.

로지스틱 회귀의 데이터 과학 문제

캠퍼스 채용은 인턴십 및 초급 직책을 위해 젊은 인재를 소싱, 참여 및 고용하기 위한 전략입니다. 종종 대학 진로 서비스 센터와 협력하고 대학생 및 최근 졸업생을 직접 만나기 위해 진로 박람회에 참석합니다.

이 기사는 데이터 과학 블로그.

차례

  1. 문제 해결과 관련된 단계
  2. 데이터 준비
  3. 로지스틱 회귀 모델 구축
  4. 로지스틱 회귀 모델의 결과
  5. 결론

문제 해결과 관련된 단계

이 문서에서는 해당 데이터 세트를 가져와서 정리한 다음 로지스틱 회귀 모델을 구축하기 위해 준비합니다. 여기서 우리의 목표는 다음과 같습니다.

먼저, 다음을 위한 데이터 세트를 준비하겠습니다. 이진 분류. 자, 무슨 뜻인가요? 아파트 가격과 같은 연속적인 가치를 예측하려고 하면 그 값은 XNUMX에서 수백만 달러 사이의 숫자일 수 있습니다. 우리는 이를 회귀 문제라고 부릅니다.

하지만 이번 프로젝트에서는 상황이 조금 다릅니다. 연속적인 값을 예측하는 대신, 우리는 그들 사이에서 예측하려는 개별 그룹이나 클래스를 갖습니다. 그래서 이것을 분류 문제라고 합니다. 우리 프로젝트에는 선택하려는 그룹이 두 개뿐이므로 이진 분류가 됩니다.

두 번째 목표는 채용을 예측하기 위한 로지스틱 회귀 모델을 만드는 것입니다. 세 번째 목표는 승산비를 사용하여 모델의 예측을 설명하는 것입니다.

이제 기계 학습 워크플로 측면에서 우리가 따를 단계와 새로운 내용 중 일부를 배우게 될 것입니다. 따라서 가져오기 단계에서는 바이너리 대상과 함께 작동하도록 데이터를 준비합니다. 탐색 단계에서는 클래스 밸런스를 살펴보겠습니다. 그렇다면 기본적으로 후보자 중 어떤 비율이 Hird이고 어떤 비율이 그렇지 않습니까? 기능 인코딩 단계에서는 범주형 기능으로 인코딩을 수행합니다. 분할 부분에서는 무작위 열차 테스트 분할을 수행합니다.

모델 구축 단계에서는 먼저 기준선을 설정하고, 정확도 점수를 사용할 것이기 때문에 정확도 점수가 무엇인지, 그것이 우리가 관심 있는 측정항목일 때 기준선을 구축하는 방법에 대해 자세히 설명하겠습니다. 둘째, 로지스틱 회귀를 수행하겠습니다. 그리고 마지막으로 평가 단계를 거치게 됩니다. 우리는 다시 정확도 점수에 초점을 맞출 것입니다. 마지막으로 결과를 전달하기 위해 승산비를 살펴보겠습니다.

마지막으로, 작업에 들어가기 전에 프로젝트에서 사용할 라이브러리에 대해 소개하겠습니다. 먼저 Google Colabe 노트북의 데이터를 io 라이브러리로 가져옵니다. 그런 다음 로지스틱 회귀 모델을 사용하므로 scikit-learn에서 이를 가져옵니다. 그 후에도 역시 사이 킷 학습, 성능 지표, 정확도 점수 및 훈련-테스트-분할을 가져옵니다.

우리는 매트플롯립 시각화를 위해 seaborn을 사용하고 눔 파이  단지 작은 수학을 위한 것입니다.
우리는 필요합니다 팬더 데이터를 조작하려면 라벨 인코더를 사용하고, 범주형 변수를 인코딩하려면 표준 스케일러를 사용하고, 데이터를 정규화하려면 표준 스케일러를 사용하세요. 그것이 우리에게 필요한 라이브러리가 될 것입니다.

데이터 준비를 시작해 보겠습니다.

#import libraries
import io
import warnings import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler warnings.simplefilter(action="ignore", category=FutureWarning)

데이터 준비

수입

데이터 준비를 시작하려면 중요한 작업을 시작하겠습니다. 먼저 데이터 파일을 로드한 다음 이를 DataFrame `df`에 넣어야 합니다.

from google.colab import files
uploaded = files.upload()
# Read CSV file
df = pd.read_csv(io.BytesIO(uploaded["Placement_Data_Full_Class.csv"]))
print(df.shape)
df.head()
로지스틱 회귀용 데이터 세트

아름다운 DataFrame을 볼 수 있으며, 목표인 `status` 속성을 포함하는 215개의 레코드와 15개의 열이 있습니다. 모든 기능에 대한 설명입니다.

로지스틱 회귀

둘러보기

이제 우리가 탐색할 이러한 모든 기능이 있습니다. 그럼 우리의 시작을 해보자 탐색 적 데이터 분석. 먼저 이 데이터프레임에 대한 정보를 살펴보고 그 중 유지해야 할 정보가 있는지 또는 삭제해야 할 정보가 있는지 살펴보겠습니다.

# Inspect DataFrame
df.info() <class 'pandas.core.frame.DataFrame'>
RangeIndex: 215 entries, 0 to 214
Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 sl_no 215 non-null int64 1 gender 215 non-null object 2 ssc_p 215 non-null float64 3 ssc_b 215 non-null object 4 hsc_p 215 non-null float64 5 hsc_b 215 non-null object 6 hsc_s 215 non-null object 7 degree_p 215 non-null float64 8 degree_t 215 non-null object 9 workex 215 non-null object 10 etest_p 215 non-null float64 11 specialisation 215 non-null object 12 mba_p 215 non-null float64 13 status 215 non-null object 14 salary 148 non-null float64
dtypes: float64(6), int64(1), object(8)
memory usage: 25.3+ KB

이제 `df` 정보를 볼 때 우리가 찾고 있는 것이 몇 가지 있습니다. 데이터 프레임에 215개의 행이 있고 우리가 스스로에게 묻고 싶은 질문은 누락된 데이터가 있습니까? 그리고 여기를 보면 채용되지 않은 후보자로 인해 예상대로 급여 열을 제외하고 누락된 데이터가 없는 것 같습니다.

여기에서 우리의 또 다른 관심사는 모델이 실제 세계에 배포되면 가지지 않을 정보를 모델에 제공하는 새는 기능이 있습니까? 모델이 후보자의 배치 여부를 예측하고 채용이 발생하기 전에 모델이 이러한 예측을 수행하기를 원한다는 점을 기억하십시오. 그래서 우리는 채용 후에 이 후보자들에 대한 어떤 정보도 주고 싶지 않습니다.

따라서 이 '급여' 기능은 회사에서 제공하는 급여에 대한 정보를 제공한다는 것이 매우 분명합니다. 그리고 이 급여는 수용된 사람들을 위한 것이기 때문에 여기서 이 기능은 누출을 구성하므로 이를 취소해야 합니다.

df.drop(columns="salary", inplace=True)

두 번째로 살펴보고 싶은 것은 이러한 다양한 기능에 대한 데이터 유형입니다. 따라서 이러한 데이터 유형을 살펴보면 목표에 대한 XNUMX개의 범주형 특성과 XNUMX개의 숫자 특성이 있으며 모든 것이 정확합니다. 이제 이러한 아이디어를 얻었으니 좀 더 깊이 탐구하는 시간을 가져보겠습니다.

우리는 목표에 두 가지 클래스가 있다는 것을 알고 있습니다. 우리는 후보를 배치했지만 후보를 배치하지 않았습니다. 문제는 이 두 클래스의 상대적 비율이 얼마나 되는지입니다. 거의 같은 밸런스인가요? 아니면 하나가 다른 것보다 훨씬 더 많은가요? 분류 문제를 풀 때 꼭 살펴봐야 할 부분입니다. 따라서 이는 EDA의 중요한 단계입니다.

# Plot class balance
df["status"].value_counts(normalize=True).plot( kind="bar", xlabel="Class", ylabel="Relative Frequency", title="Class Balance"
);
로지스틱 회귀에 대한 클래스 불균형

긍정적인 클래스 '배치됨'은 관찰의 65% 이상을 차지하며, 부정적인 클래스 '배치되지 않음'은 약 30%를 차지합니다. 자, 만약 이것이 매우 불균형했다면, 예를 들어 80보다 크거나 그 이상이면 나는 이것이 불균형 클래스라고 말할 것입니다. 그리고 모델이 올바른 방식으로 작동하는지 확인하기 위해 몇 가지 작업을 수행해야 합니다. 그러나 이것은 괜찮은 균형입니다.

기능과 대상 간의 연결을 확인하기 위해 또 다른 시각화를 만들어 보겠습니다. 숫자 특징부터 시작해 보겠습니다.

먼저 분포도를 사용하여 특성의 개별 분포를 확인하고 상자 그림을 사용하여 수치 특성과 대상 간의 관계도 확인합니다.

fig,ax=plt.subplots(5,2,figsize=(15,35))
for index,i in enumerate(df.select_dtypes("number").drop(columns="sl_no")): plt.suptitle("Visualizing Distribution of Numerical Columns Indivualy and by Class",size=20) sns.histplot(data=df, x=i, kde=True, ax=ax[index,0]) sns.boxplot(data=df, x='status', y=i, ax=ax[index,1]);
"로지스틱 회귀

플롯의 첫 번째 열에서 모든 분포가 정규 분포를 따르고 대부분의 지원자의 교육 성과가 60-80% 사이임을 알 수 있습니다.

두 번째 열에는 오른쪽에 'Placed' 클래스가 있고 왼쪽에 'Not Placed' 클래스가 있는 이중 상자 그림이 있습니다. 'etest_p' 및 'mba_p' 기능의 경우 모델 구축 관점에서 이 두 분포에 큰 차이가 없습니다. 클래스에 대한 분포에는 상당한 중복이 있으므로 이러한 기능은 목표를 잘 예측할 수 없습니다. 나머지 기능에 대해서는 목표에 대한 잠재적인 좋은 예측 변수로 사용할 수 있을 만큼 충분히 뚜렷합니다. 범주형 기능으로 넘어가겠습니다. 그리고 이를 탐색하기 위해 개수 플롯을 사용합니다.

fig,ax=plt.subplots(7,2,figsize=(15,35))
for index,i in enumerate(df.select_dtypes("object").drop(columns="status")): plt.suptitle("Visualizing Count of Categorical Columns",size=20) sns.countplot(data=df,x=i,ax=ax[index,0]) sns.countplot(data=df,x=i,ax=ax[index,1],hue="status")
"로지스틱 회귀

줄거리를 보면 여성 후보보다 남성 후보가 더 많은 것을 알 수 있습니다. 그리고 대부분의 후보자들은 업무 경험이 없지만 이 후보자들은 경력이 있는 후보자보다 더 많이 채용되었습니다. 우리는 'hsc' 과정으로 상업을 전공한 후보자가 있으며, 학부생뿐만 아니라 과학 배경을 가진 후보자가 두 경우 모두 두 번째로 높습니다.

로지스틱 회귀 모델에 대한 약간의 참고 사항은 분류를 위한 것이지만 선형 회귀와 같은 다른 선형 모델과 동일한 그룹에 속하며 이러한 이유로 둘 다 선형 모델이기 때문입니다. 다중공선성 문제도 걱정할 필요가 있다. 따라서 상관 행렬을 생성한 다음 이를 히트맵에 표시해야 합니다. 우리는 여기서 모든 특징을 보고 싶지 않고 숫자 특징만 보고 싶고 목표를 포함하고 싶지 않습니다. 우리의 목표가 우리의 일부 기능과 상관관계가 있다면 그것은 매우 좋은 것입니다.

corr = df.select_dtypes("number").corr()
# Plot heatmap of `correlation`
plt.title('Correlation Matrix')
sns.heatmap(corr, vmax=1, square=True, annot=True, cmap='GnBu');
상관 행렬

연한 파란색은 상관관계가 거의 또는 전혀 없음을 의미하고 진한 파란색은 상관관계가 더 높다는 것을 의미합니다. 그래서 우리는 그 진한 파란색을 경계하고 싶습니다. 우리는 진한 파란색 선, 즉 이 플롯의 중앙을 따라 내려가는 대각선을 볼 수 있습니다. 그것들은 그 자체와 상관관계가 있는 특징입니다. 그리고 어두운 사각형이 보입니다. 이는 기능 간에 많은 상관 관계가 있음을 의미합니다.

EDA의 마지막 단계에서 범주형 기능에서 높음-낮음 카디널리티를 확인해야 합니다. 카디널리티는 범주형 변수에서 고유한 값의 수를 나타냅니다. 카디널리티가 높다는 것은 범주 기능에 고유한 값이 많다는 것을 의미합니다. 기능을 높은 카디널리티로 만드는 고유 값의 정확한 수는 없습니다. 그러나 범주형 기능의 값이 거의 모든 관측치에 대해 고유한 경우 일반적으로 삭제할 수 있습니다.

# Check for high- and low-cardinality categorical features
df.select_dtypes("object").nunique() gender 2
ssc_b 2
hsc_b 2
hsc_s 3
degree_t 3
workex 2
specialisation 2
status 2
dtype: int64

고유 값 수가 XNUMX이거나 매우 높은 열은 표시되지 않습니다. 하지만 여기에는 누락된 범주형 열이 하나 있는 것 같습니다. 그 이유는 객체로 인코딩되지 않고 정수로 인코딩되기 때문입니다. 'sl_no' 열은 우리가 알고 있는 의미의 정수가 아닙니다. 이 후보자들은 어떤 순서로 순위가 매겨집니다. 그냥 고유한 이름표이고, 이름이 마치 카테고리 같죠? 따라서 이것은 범주형 변수입니다. 그리고 여기에는 아무런 정보도 없으므로 삭제해야 합니다.

df.drop(columns="sl_no", inplace=True)

기능 인코딩

분석을 마쳤고 다음으로 해야 할 일은 범주형 기능을 인코딩하는 것입니다. 'LabelEncoder'를 사용하겠습니다. 레이블 인코딩은 범주형 변수를 처리하는 데 널리 사용되는 인코딩 기술입니다. 이 기술을 사용하면 각 레이블에 알파벳 순서에 따라 고유한 정수가 할당됩니다.

lb = LabelEncoder () cat_data = ['gender', 'ssc_b', 'hsc_b', 'hsc_s', 'degree_t', 'workex', 'specialisation', 'status']
for i in cat_data: df[i] = lb.fit_transform(df[i]) df.head()
코드 출력

스플릿

데이터를 가져오고 정리했습니다. 약간의 탐색적 데이터 분석을 수행했으며 이제 데이터를 분할해야 합니다. 분할에는 수직 분할 또는 기능 대상과 수평 분할 또는 학습 테스트 세트의 두 가지 유형이 있습니다. 수직 분할부터 시작하겠습니다. 특징 행렬 'X'와 대상 벡터 'y'를 만듭니다. 우리의 목표는 "상태"입니다. 우리의 특징은 'df'에 남아 있는 모든 열이어야 합니다.

#vertical split
target = "status"
X = df.drop(columns = target)
y = df[target]

모델은 일반적으로 학습할 정규화된 데이터가 있을 때 더 나은 성능을 발휘합니다. 그렇다면 정규화란 무엇일까요? 표준화 여러 변수의 값을 비슷한 범위로 변환하는 것입니다. 우리의 목표는 변수를 정규화하는 것입니다. 따라서 값 범위는 0에서 1까지입니다. 그렇게 하고 'StandardScaler'를 사용하겠습니다.

scaler = StandardScaler()
X = scaler.fit_transform(X)

이제 수평 분할 또는 학습 테스트 세트를 수행해 보겠습니다. 무작위 학습-테스트 분할을 사용하여 데이터(X 및 y)를 학습 및 테스트 세트로 나누어야 합니다. 테스트 세트는 전체 데이터의 20%가 되어야 합니다. 그리고 재현성을 위해 Random_state를 설정하는 것을 잊지 마세요.

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.2, random_state = 42 ) print("X_train shape:", X_train.shape)
print("y_train shape:", y_train.shape)
print("X_test shape:", X_test.shape)
print("y_test shape:", y_test.shape) X_train shape: (172, 12)
y_train shape: (172,)
X_test shape: (43, 12)
y_test shape: (43,)

로지스틱 회귀 모델 구축

기준

이제 모델 구축을 시작해야 하며 기준선을 설정하기 위한 주문을 시작해야 합니다. 우리가 다루고 있는 문제 유형은 분류 문제이며 분류 모델을 평가하기 위한 다양한 측정항목이 있다는 점을 기억하세요. 제가 집중하고 싶은 것은 정확도 점수입니다.

이제 정확도 점수는 무엇입니까? 머신러닝의 정확도 점수는 전체 예측 수 중 모델이 정확하게 예측한 수를 측정하는 평가 지표입니다. 정확한 예측 수를 전체 예측 수로 나누어 계산합니다. 이것이 의미하는 바는 정확도 점수가 0에서 1 사이라는 것입니다. XNUMX은 좋지 않습니다. 그곳은 당신이 있고 싶지 않은 곳이고 하나는 완벽합니다. 따라서 이를 염두에 두고 기준선은 관찰 내용에 관계없이 하나의 예측만 반복해서 제공하는 모델이라는 점을 기억하세요.

우리의 경우 배치 여부에 따라 두 개의 클래스가 있습니다. 그렇다면 우리가 단 하나의 예측만 할 수 있다면 우리가 추측할 수 있는 것은 무엇일까요? 대다수 클래스라고 말하면. 제 생각엔 그게 말이 된다고 생각해요, 그렇죠? 예측이 하나만 있을 수 있다면 데이터 세트에서 관측치가 가장 높은 예측을 선택해야 할 것입니다. 따라서 우리의 기준에서는 훈련 데이터에 다수 클래스가 나타나는 비율을 사용합니다. 모델이 이 기준을 능가하지 못하는 경우 기능은 관찰을 분류하는 데 유용한 정보를 추가하지 않습니다.

기준 정확도를 계산하기 위해 `normalize = True` 인수와 함께 'value_counts' 메소드를 사용할 수 있습니다.

acc_baseline = y_train.value_counts(normalize=True).max()
print("Baseline Accuracy:", round(acc_baseline, 2)) Baseline Accuracy: 0.68

기준 정확도가 비율로 68% 또는 0.68임을 알 수 있습니다. 그래서 쓸모 있는 가치를 더하기 위해 우리는 그 숫자를 넘어 XNUMX에 가까워지고 싶습니다. 이것이 우리의 목표입니다. 이제 모델 구축을 시작하겠습니다.

반복

이제 로지스틱 회귀를 사용하여 모델을 구축할 차례입니다. 우리는 로지스틱 회귀를 사용할 것입니다. 하지만 그 전에 로지스틱 회귀가 무엇인지, 어떻게 작동하는지에 대해 조금 이야기한 다음 코딩 작업을 할 수 있습니다. 이를 위해 여기에 작은 그리드가 있습니다.

x축을 따라 데이터 세트에 후보의 p_degrees가 있다고 가정해 보겠습니다. 오른쪽에서 왼쪽으로 이동하면 각도가 점점 더 높아지고 Y축을 따라 배치할 수 있는 클래스가 XNUMX과 XNUMX로 표시됩니다.

로지스틱 회귀 그래프

그렇다면 데이터 포인트를 그려보면 어떤 모습일까요? 우리의 분석에 따르면 'p_degree'가 높은 후보자가 채용될 가능성이 더 높습니다. 따라서 작은 `p_degree`를 가진 후보는 XNUMX으로 내려가는 것과 같이 보일 것입니다. 그리고 'p_degree'가 높은 후보자는 XNUMX이 될 것입니다.

로지스틱 회귀에 대한 p 등급

이제 우리가 이것으로 선형 회귀를 수행하고 싶다고 가정해 보겠습니다. 선을 그리고 싶다고 가정해 보겠습니다.
이제 그렇게 하면 그 선은 가능한 한 모든 점에 가까워지도록 그려질 것입니다. 그래서 우리는 아마도 다음과 같은 라인으로 끝날 것입니다. 좋은 모델이 될까요?

반복하다

설마. 무슨 일이 일어날지는 후보자의 p_degree에 관계없이 항상 일종의 값을 얻게 됩니다. 그리고 이 맥락에서 숫자는 아무 의미도 없기 때문에 그것은 우리에게 도움이 되지 않습니다. 이 분류 문제는 XNUMX 또는 XNUMX이어야 합니다. 따라서 그런 식으로는 작동하지 않을 것입니다.

반면에 이것은 선이기 때문에 p_degree가 매우 낮은 후보가 있다면 어떨까요? 그런데 갑자기 우리의 추정치가 음수로 나왔습니다. 그리고 다시 말하지만, 이것은 말이 되지 않습니다. XNUMX이나 XNUMX이어야 하는 음수는 없습니다. 같은 방식으로 p_degree가 매우 높은 후보자가 있으면 XNUMX보다 높은 긍정적인 결과를 얻을 수 있습니다. 그리고 다시 말하지만, 그것은 말이 되지 않습니다. XNUMX이나 XNUMX이 필요합니다.

예측

따라서 여기서 볼 수 있는 것은 분류에 선형 회귀를 사용하는 데 있어 몇 가지 심각한 제한 사항입니다. 그러면 우리는 무엇을 해야 합니까? 우리는 XNUMX번 모델을 만들어야 합니다. 즉, XNUMX보다 낮거나 XNUMX보다 높지 않으므로 XNUMX과 XNUMX 사이에 묶여 있어야 합니다. 그리고 두 번째는, 그 함수, 즉 우리가 만든 방정식에서 무엇이 나오든 그것을 예측 그 자체로 다루어서는 안 되고 최종 예측을 만들기 위한 단계로 다루어야 할 것입니다.

이제 제가 방금 말한 내용을 풀고 선형 회귀 모델을 수행할 때 가장 간단한 형식인 선형 방정식으로 끝난다는 점을 상기해 보겠습니다. 그리고 이것이 우리에게 직선을 제공하는 방정식 또는 함수입니다.

IMG

0과 1 사이에 해당 선을 묶는 방법이 있습니다. 그리고 우리가 할 수 있는 일은 방금 만든 이 함수를 시그모이드 함수라고 하는 다른 함수로 묶는 것입니다.

로지스틱 회귀 함수

그래서, 저는 우리가 방금 가지고 있는 선형 방정식을 취할 것이고, 그것을 시그모이드 함수에서 축소하고 그것을 지수로 넣을 것입니다.

로지스틱 회귀 함수

무슨 일이 일어나는지는 직선을 얻는 대신에 다음과 같은 선을 얻는 것입니다. 하나에 붙어 있습니다. 들어와서 구불구불하게 움직입니다. 그런 다음 XNUMX에 고정됩니다.

로지스틱 회귀

맞습니다, 이것이 선의 모습입니다. 그리고 우리는 첫 번째 문제를 해결했음을 알 수 있습니다. 이 함수에서 얻는 값은 0과 1 사이입니다. 두 번째 단계에서는 이 방정식에서 나오는 값을 최종 예측으로 처리하지 않습니다. 대신 확률로 처리하겠습니다.

로지스틱 회귀

내 말은 무슨 뜻인가요? 이는 내가 예측을 할 때 0과 1 사이의 부동 소수점 값을 얻게 된다는 의미입니다. 그리고 내가 할 일은 이를 내 예측이 양성 클래스에 속할 확률로 처리하는 것입니다.

그래서 나는 0.9999의 가치를 얻습니다. 이 후보자가 우리의 긍정적인 배치 클래스에 속할 확률은 99%라고 말하고 싶습니다. 그래서 나는 그것이 긍정적인 부류에 속한다고 거의 확신합니다. 반대로, 0.001 지점이나 그 이하에서 하락한다면 이 수치는 낮다고 말할 것입니다. 이 특정 관찰이 긍정적인 클래스에 속할 확률은 거의 XNUMX입니다. 그래서 나는 그것이 클래스 XNUMX에 속한다고 말할 것입니다.

따라서 이는 0.5에 가깝거나 XNUMX에 가까운 숫자에 적합합니다. 하지만 그 사이에 있는 다른 값으로 무엇을 해야 하는지 스스로에게 물어볼 수도 있습니다. 작동 방식은 XNUMX에 컷오프 라인을 두는 것입니다. 따라서 해당 라인 아래에 있는 값은 모두 XNUMX으로 설정하므로 예측은 '아니요'이고 해당 라인 위에 있으면 포인트 XNUMX 위에 있으면 됩니다. , 나는 이것을 긍정적인 클래스에 넣을 것입니다. 내 예측은 하나입니다.

p 학위

이제 0.5과 50 사이의 예측을 제공하는 함수가 생겼고 이를 확률로 처리합니다. 그리고 만약 그 확률이 ​​50나 1000%보다 크다면, 저는 포지티브 클래스 XNUMX이라고 말합니다. 그리고 만약 그것이 XNUMX% 미만이라면, 그것은 네거티브 클래스, XNUMX입니다. 이것이 로지스틱 회귀가 작동하는 방식입니다. 이제 우리는 그것을 이해했으니, 코드를 작성하고 맞춰보겠습니다. 하이퍼파라미터 'max_iter'를 XNUMX으로 설정하겠습니다. 이 매개변수는 솔버가 수렴하는 최대 반복 횟수를 나타냅니다.

# Build model
model = LogisticRegression(max_iter=1000) # Fit model to training data
model.fit(X_train, y_train) LogisticRegression(max_iter=1000)

평가

이제 우리 모델이 어떻게 작동하는지 살펴보겠습니다. 이제 로지스틱 회귀 모델을 평가할 차례입니다. 따라서 이번에 우리가 관심을 두는 성능 지표는 정확도 점수이고 우리는 정확한 점수를 원한다는 점을 기억하자. 그리고 우리는 기준선인 0.68을 초과하고 싶습니다. 모델 정확도는 Accuracy_score 함수를 사용하여 계산할 수 있습니다. 이 함수에는 실제 레이블과 예측 레이블이라는 두 개의 인수가 필요합니다.

acc_train = accuracy_score(y_train, model.predict(X_train))
acc_test = model.score(X_test, y_test) print("Training Accuracy:", round(acc_train, 2))
print("Test Accuracy:", round(acc_test, 2)) Training Accuracy: 0.9
Test Accuracy: 0.88

훈련 정확도가 90%인 것을 볼 수 있습니다. 기준선을 뛰어넘고 있습니다. 테스트 정확도는 88%로 약간 낮았습니다. 또한 기준선을 뛰어넘었고 훈련 정확도에 매우 가깝습니다. 이는 좋은 소식입니다. 왜냐하면 이는 우리 모델이 과적합되거나 다른 것이 아니라는 것을 의미하기 때문입니다.

로지스틱 회귀 모델의 결과

로지스틱 회귀를 사용하면 최종 예측이 XNUMX 또는 XNUMX이 된다는 점을 기억하세요. 그러나 그 예측 아래에는 XNUMX과 XNUMX 사이의 부동 소수점 숫자의 확률이 있으며 때로는 이러한 확률 추정치가 무엇인지 확인하는 것이 도움이 될 수 있습니다. 훈련 예측을 살펴보고 처음 XNUMX개를 살펴보겠습니다. 'predict' 방법은 레이블이 지정되지 않은 관측값의 목표를 예측합니다.

model.predict(X_train)[:5] array([0, 1, 1, 1, 1])

이것이 최종 예측이었는데, 그 뒤에 숨은 확률은 얼마나 됩니까? 이를 얻으려면 약간 다른 코드를 작성해야 합니다. 모델에 `predict` 방법을 사용하는 대신 훈련 데이터에 'predict_proba'를 사용하겠습니다.

y_train_pred_proba = model.predict_proba(X_train)
print(y_train_pred_proba[:5]) [[0.92003219 0.07996781] [0.03202019 0.96797981] [0.00678421 0.99321579] [0.03889446 0.96110554] [0.00245525 0.99754475]]

두 개의 서로 다른 열이 포함된 일종의 중첩 목록을 볼 수 있습니다. 왼쪽 열은 후보자가 배치되지 않거나 부정적인 클래스 '배치되지 않음'이 발생할 확률을 나타냅니다. 다른 열은 '배치됨' 양성 클래스 또는 후보자가 배치될 확률을 나타냅니다. 우리는 두 번째 열에 중점을 둘 것입니다. 첫 번째 확률 추정치를 오른쪽으로 보면 이것이 0.07임을 알 수 있습니다. 따라서 이는 50% 미만이므로 우리 모델에서는 내 예측이 0.5이라고 말합니다. 다음 예측에서는 모두 XNUMX보다 크다는 것을 알 수 있습니다. 이것이 바로 우리 모델이 결국 XNUMX을 예측한 이유입니다.

이제 기능 이름과 중요도를 추출하여 시리즈에 넣으려고 합니다. 그리고 특성 중요도를 승산비로 표시해야 하므로 중요도의 지수를 취하여 약간의 수학적 변환을 수행해야 합니다.

# Features names
features = ['gender', 'ssc_p', 'ssc_b', 'hsc_p', 'hsc_b', 'hsc_s', 'degree_p' ,'degree_t', 'workex', 'etest_p', 'specialisation', 'mba_p']
# Get importances
importances = model.coef_[0]
# Put importances into a Series
odds_ratios = pd.Series(np.exp(importances), index= features).sort_values()
# Review odds_ratios.head() mba_p 0.406590
degree_t 0.706021
specialisation 0.850301
hsc_b 0.876864
etest_p 0.877831
dtype: float64

승산비와 승산비에 대해 논의하기 전에 수평 막대 차트에서 승산비를 살펴보겠습니다. Pandas를 사용하여 플롯을 만들고 XNUMX개의 가장 큰 계수를 찾을 것임을 기억하십시오. 그리고 우리는 모든 승산비를 사용하고 싶지 않습니다. 그래서 우리는 꼬리를 사용하고 싶습니다.

# Horizontal bar chart, five largest coefficients
odds_ratios.tail().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("High Importance Features");
# 수평 막대 차트, XNUMX개의 가장 큰 계수 odds_ratios.tail().plot(kind=

이제 5시에 수직선이 있다고 상상해 보세요. 그리고 그것을 살펴보는 것부터 시작하고 싶습니다. 이들 각각에 대해 개별적으로 또는 첫 번째 커플에 대해 이야기합시다. 그럼 여기서 '중등 교육 비율 - 10학년'을 나타내는 'ssc_p'부터 시작해 보겠습니다. 그리고 우리는 승산비가 30이라는 것을 알 수 있습니다. 자, 그것은 무엇을 의미합니까? 이는 후보자의 'ssc_p'가 높으면 모든 조건이 동일할 때 해당 후보자가 배치될 확률이 다른 후보자보다 XNUMX배 더 높다는 것을 의미합니다. 그래서 또 다르게 생각하면 후보자가 `ssc_p`를 가지고 있을 때 후보자의 채용 확률이 XNUMX배 증가한다는 것입니다.

따라서 배당률이 XNUMX를 초과하면 후보가 배치될 확률이 높아집니다. 그래서 수직선이 XNUMX에 있는 것입니다. 그리고 이 다섯 가지 특징은 채용 증가와 가장 관련이 있는 특징입니다. 이것이 우리의 배당률입니다. 이제 채용 증가와 가장 관련이 있는 기능을 살펴보았습니다. 그것과 관련된 기능, 채용 감소를 살펴 보겠습니다. 이제 가장 작은 것을 볼 때입니다. 그래서 꼬리를 보는 대신 꼬리를 보도록 하겠습니다.

odds_ratios.head().plot(kind="barh")
plt.xlabel("Odds Ratio")
plt.xlabel("Odds Ratio")
plt.ylabel("Feature")
plt.title("Low Importance Features");
중요도가 낮은 기능

여기서 가장 먼저 확인해야 할 것은 x축에서 모든 것이 0.45 이하라는 점입니다. 자, 그게 무슨 뜻인가요? 여기에서 가장 작은 배당률을 살펴보겠습니다. MBA 백분율을 나타내는 mba_p입니다. 약 0.45에서 준비가 된 것을 볼 수 있습니다. 자, 그게 무슨 뜻인가요? 1와 0.55의 차이는 55입니다. 괜찮은? 그리고 그 숫자는 무엇을 의미합니까? 다른 모든 조건이 같다면 MBA 지원자는 채용될 가능성이 0.55% 더 낮습니다. 괜찮은? 따라서 모집 확률이 55 또는 XNUMX% 감소했습니다. 그리고 그것은 여기 있는 모든 것에 사실입니다.

결론

그래서 우리는 무엇을 배웠나요? 첫째, 준비된 데이터 단계에서 우리는 로지스틱 회귀를 사용하여 분류, 특히 이진 분류 작업을 수행하고 있음을 배웠습니다. 데이터 탐색 측면에서 우리는 수많은 작업을 수행했지만 하이라이트 측면에서는 클래스 밸런스를 살펴보았습니다. 그렇죠? 긍정적인 클래스와 부정적인 클래스의 비율입니다. 그런 다음 데이터를 분할합니다.

로지스틱 회귀는 분류 모델이므로 새로운 성능 지표인 정확도 점수에 대해 배웠습니다. 이제 정확도 점수는 0에서 1 사이입니다. XNUMX은 나쁘고 XNUMX은 좋습니다. 반복하면서 로지스틱 회귀에 대해 배웠습니다. 이는 선형 방정식, 직선을 가져와 다른 함수, 시그모이드 함수 및 활성화 함수에 넣고 확률 추정치를 얻고 그 확률 추정치를 예측으로 바꿀 수 있는 마법 같은 방법입니다.

마지막으로, 승산비와 계수를 해석하여 특정 특성이 후보자 모집 확률을 높이는지 확인하는 방법에 대해 배웠습니다.

프로젝트 소스 코드: https://github.com/SawsanYusuf/Campus-Recruitment.git

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다. 

타임 스탬프 :

더보기 분석 Vidhya