Hồi quy logistic với các biến phân loại python

Chào mừng bạn đến với một blog khác về Hồi quy logistic trong python. Trong blog trước Hồi quy logistic cho Machine Learning bằng Python, chúng ta đã thấy hồi quy logistic đơn biến. Và chúng ta đã thấy các khái niệm cơ bản về phân loại nhị phân, Đường cong Sigmoid, Hàm khả năng và Tỷ lệ cược và tỷ lệ cược log

Trong, phần này trước tiên sẽ xem xét các khái niệm hồi quy Logistic đa biến. Và sau đó chúng ta sẽ xây dựng hồi quy logistic trong python

Hồi quy logistic cho Machine Learning là một trong những thuật toán học máy phổ biến nhất để phân loại nhị phân

Hồi quy logistic đa biến cho Machine Learning

Trong hồi quy logistic này, nhiều biến sẽ sử dụng. Như chúng ta có thể thấy, có nhiều biến số để phân loại "Churn"

Ví dụ

Bảng-1 Bộ dữ liệu rời mạng viễn thông

Trong hồi quy logistic đa biến, chúng ta có nhiều biến độc lập X1, X2, X3, X4,…, Xn. Vì vậy, biểu thức của hàm Sigmoid sẽ như sau

Trường hợp sử dụng Churn viễn thông

Vì vậy, bây giờ chúng ta sẽ xây dựng một mô hình hồi quy logistic với trường hợp sử dụng mạng viễn thông

Có một công ty ‘X‘ họ kiếm được phần lớn doanh thu nhờ sử dụng dịch vụ thoại và internet. Và công ty này duy trì thông tin về khách hàng

  • Thông tin liên quan
    1. nhân khẩu học
    2. dịch vụ có sẵn
    3. chi phí

Có những thông tin khác mà họ đang duy trì và họ muốn hiểu hành vi của khách hàng. Họ muốn biết liệu khách hàng có rời bỏ

Vì vậy, bây giờ hãy bắt đầu và xây dựng một mô hình sẽ cho chúng tôi biết liệu khách hàng có rời đi hay không. Rời bỏ có nghĩa là khách hàng sẽ chuyển sang nhà khai thác viễn thông khác

Vì vậy, nhập và hợp nhất dữ liệu

Nhập tất cả các bộ dữ liệu

# Importing Pandas and NumPy
import pandas as pd
import numpy as np
# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]

Vì vậy, chúng tôi có ba tệp CSV. Dữ liệu rời tệp đầu tiên có thông tin liên quan đến khách hàng, Tệp thứ hai có dữ liệu nhân khẩu học của khách hàng. Và thứ ba, có thông tin liên quan đến việc sử dụng internet của khách hàng
Vì vậy, chúng tôi sẽ hợp nhất cả ba bộ dữ liệu này thành một khung dữ liệu duy nhất

#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']

Chuẩn bị dữ liệu

Bây giờ chúng ta sẽ thực hiện chuẩn bị dữ liệu, bây giờ chuyển biến phân loại thành 1 hoặc 0

# Converting Yes to 1 and No to 0
telecom['PhoneService'] = telecom['PhoneService'].map[{'Yes': 1, 'No': 0}]
telecom['PaperlessBilling'] = telecom['PaperlessBilling'].map[{'Yes': 1, 'No': 0}]
telecom['Churn'] = telecom['Churn'].map[{'Yes': 1, 'No': 0}]
telecom['Partner'] = telecom['Partner'].map[{'Yes': 1, 'No': 0}]
telecom['Dependents'] = telecom['Dependents'].map[{'Yes': 1, 'No': 0}]

Bây giờ sẽ tạo một biến giả, Trong quá trình này, chúng tôi chuyển đổi biến phân loại thành biến giả/chỉ báo. Vì mô hình Machine learning chỉ hiểu được biến số. và nếu chúng ta có bất kỳ biến phân loại nào, chúng ta có thể tạo mã hóa một lần nóng

Tại sao dữ liệu mã hóa một lần nóng trong học máy?

Một ví dụ điển hình về mã hóa một lần nóng là biến phân loại. Nhưng câu hỏi đặt ra là tại sao lại cần mã hóa one-hot. Tại sao chúng ta không thể khớp dữ liệu trực tiếp với mô hình

Vì vậy, trong một biến phân loại từ chỉ báo Churn của Bảng-1 sẽ là 'Có' hoặc 'Không', không gì khác ngoài một biến phân loại. Nhiều thuật toán học máy không thể hoạt động với các biến phân loại. Bởi vì tất cả chúng đều yêu cầu một biến số. Chỉ thuật toán Cây quyết định mới có thể hoạt động với các biến phân loại

Điều này có nghĩa là biến phân loại phải được chuyển đổi thành dạng số. Bây giờ chúng ta có thể chuyển đổi biến phân loại này theo hai cách

  • mã hóa số
  • mã hóa một lần nóng

Trong mã hóa số, mỗi biến phân loại duy nhất được chuyển đổi thành giá trị số nguyên. ví dụ: trong chỉ báo rời bỏ từ Bảng-1 chuyển đổi thành Có=1 và Không=2

Nhưng có một vấn đề với việc sử dụng mã hóa số này để có thứ tự. Do đó, mô hình giả định rằng thứ tự tự nhiên giữa các danh mục có thể dẫn đến hiệu suất kém hoặc kết quả không mong muốn

Trong trường hợp này, mã hóa một lần có thể được áp dụng cho biểu diễn số nguyên. Đây là nơi biến mã hóa số nguyên bị loại bỏ và một biến nhị phân mới được thêm vào cho mỗi giá trị số nguyên duy nhất

Ví dụ

Chỉ báo rời bỏ có ba giá trị phân loại Có, Không, Có thể. Do đó, ba biến nhị phân là cần thiết. Giá trị “1” được đặt trong biến nhị phân cho giá trị khuấy đảo và giá trị “0” cho chỉ báo khuấy đảo khác. Các biến nhị phân thường được gọi là “biến giả”

Yes,	No,	Maybe
1,		0,		0
0,		1,		0
0,		0,		1

Vì vậy, hãy quay trở lại vấn đề của chúng ta, bây giờ chúng ta sẽ chuyển đổi tất cả các biến phân loại thành biến giả

# Creating a dummy variable for the variable 'Contract' and dropping the first one.
cont = pd.get_dummies[telecom['Contract'],prefix='Contract',drop_first=True]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,cont],axis=1]
# Creating a dummy variable for the variable 'PaymentMethod' and dropping the first one.
pm = pd.get_dummies[telecom['PaymentMethod'],prefix='PaymentMethod',drop_first=True]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,pm],axis=1]
# Creating a dummy variable for the variable 'gender' and dropping the first one.
gen = pd.get_dummies[telecom['gender'],prefix='gender',drop_first=True]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,gen],axis=1]
# Creating a dummy variable for the variable 'MultipleLines' and dropping the first one.
ml = pd.get_dummies[telecom['MultipleLines'],prefix='MultipleLines']
#  dropping MultipleLines_No phone service column
ml1 = ml.drop[['MultipleLines_No phone service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,ml1],axis=1]
# Creating a dummy variable for the variable 'InternetService' and dropping the first one.
iser = pd.get_dummies[telecom['InternetService'],prefix='InternetService',drop_first=True]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,iser],axis=1]
# Creating a dummy variable for the variable 'OnlineSecurity'.
os = pd.get_dummies[telecom['OnlineSecurity'],prefix='OnlineSecurity']
os1= os.drop[['OnlineSecurity_No internet service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,os1],axis=1]
# Creating a dummy variable for the variable 'OnlineBackup'.
ob =pd.get_dummies[telecom['OnlineBackup'],prefix='OnlineBackup']
ob1 =ob.drop[['OnlineBackup_No internet service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,ob1],axis=1]
# Creating a dummy variable for the variable 'DeviceProtection'. 
dp =pd.get_dummies[telecom['DeviceProtection'],prefix='DeviceProtection']
dp1 = dp.drop[['DeviceProtection_No internet service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,dp1],axis=1]
# Creating a dummy variable for the variable 'TechSupport'. 
ts =pd.get_dummies[telecom['TechSupport'],prefix='TechSupport']
ts1 = ts.drop[['TechSupport_No internet service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,ts1],axis=1]
# Creating a dummy variable for the variable 'StreamingTV'.
st =pd.get_dummies[telecom['StreamingTV'],prefix='StreamingTV']
st1 = st.drop[['StreamingTV_No internet service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,st1],axis=1]
# Creating a dummy variable for the variable 'StreamingMovies'. 
sm =pd.get_dummies[telecom['StreamingMovies'],prefix='StreamingMovies']
sm1 = sm.drop[['StreamingMovies_No internet service'],1]
#Adding the results to the master dataframe
telecom = pd.concat[[telecom,sm1],axis=1]
# We have created dummies for the below variables, so we can drop them
telecom = telecom.drop[['Contract','PaymentMethod','gender','MultipleLines','InternetService', 'OnlineSecurity', 'OnlineBackup', 'DeviceProtection',
       'TechSupport', 'StreamingTV', 'StreamingMovies'], 1]
#The varaible was imported as a string we need to convert it to float
telecom['TotalCharges'] =telecom['TotalCharges'].convert_objects[convert_numeric=True]
#telecom['tenure'] = telecom['tenure'].astype[int].astype[float]

Bây giờ chúng ta có thể thực hiện một số quy trình làm sạch. Tham khảo liên kết GitHub này

  • Kiểm tra các ngoại lệ trong các biến liên tục
  • Cộng các giá trị còn thiếu theo cột
  • Xóa các hàng NaN TotalCharges
  • Bình thường hóa các tính năng liên tục
    • tiêu chuẩn hóa. x=x−mean[x]sd[x]
    • [Có nghĩa là] Bình thường hóa. x=x−min[x]max[x]−min[x] tham khảo cái này
  • Kiểm tra tỷ lệ khuấy

Tòa nhà mô hình

Xây dựng mô hình hồi quy logistic trong python. chúng tôi sẽ sử dụng hai thư viện mô hình thống kê và sklearn. Trong mô hình thống kê, hiển thị tóm tắt thống kê của mô hình dễ dàng hơn. Chẳng hạn như ý nghĩa của các hệ số [giá trị p]. và bản thân các hệ số, v.v. , điều này không đơn giản trong Sklearn.  

Hãy bắt đầu bằng cách chia dữ liệu của chúng tôi thành tập huấn luyện và tập kiểm tra

from sklearn.model_selection import train_test_split
import statsmodels.api as sm
# Putting feature variable to X
X = telecom.drop[['Churn','customerID'],axis=1]
# Putting response variable to y
y = telecom['Churn']
# Splitting the data into train and test
X_train, X_test, y_train, y_test = train_test_split[X,y, train_size=0.7,test_size=0.3,random_state=100]

Mẫu-1

# Logistic regression model
logm1 = sm.GLM[y_train,[sm.add_constant[X_train]], family = sm.families.Binomial[]]
logm1.fit[].summary[]

Bây giờ nếu xem các số liệu tương quan

# Importing matplotlib and seaborn
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# Let's see the correlation matrix 
plt.figure[figsize = [20,10]]        # Size of the figure
sns.heatmap[telecom.corr[],annot = True]

bản đồ nhiệt

Nếu chúng ta tìm thấy đa cộng tuyến thì nó sẽ dẫn đến sự nhầm lẫn về mối quan hệ thực sự giữa các biến phụ thuộc và biến độc lập

Để kiểm tra tính đa cộng tuyến, chúng ta có thể tìm các giá trị Hệ số lạm phát phương sai [VIF]. Giá trị VIF từ 5 trở xuống cho biết không có đa cộng tuyến. Trong mối tương quan cao, VIF >5 và chúng tôi có thể loại bỏ biến đó. Bởi vì sẽ khó ước tính mối quan hệ thực sự giữa các biến phụ thuộc và biến độc lập

Vì vậy, chúng ta có thể thấy trong bản đồ nhiệt, rất nhiều biến có mối tương quan cao. Vì vậy, chúng ta có thể loại bỏ các biến tương quan cao

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
0

Khi bạn có một số lượng lớn các biến dự đoán, chẳng hạn như 20-30. Sẽ rất hữu ích khi sử dụng một kỹ thuật lựa chọn tính năng tự động như RFE. Để giảm số lượng biến xuống một số nhỏ hơn [giả sử 10-12] và sau đó loại bỏ thủ công thêm một số

Lựa chọn tính năng bằng RFE

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
1
# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
2

Bây giờ, hãy chạy mô hình bằng cách sử dụng các biến đã chọn

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
3

Mẫu-2

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
4

VIF sẽ cho biết đa cộng tuyến giữa biến độc lập. Nếu VIF > 5 nghĩa là tương quan cao. Hãy tạo một phương thức cho VIF

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
5_______1_______6

Tương tự, bạn có thể biến từng phần tử có giá trị VIF cao

Bây giờ, hãy chạy mô hình bằng cách sử dụng các biến đã chọn bằng hồi quy logistic. Ở trên chúng ta đã chọn 13 biến bây giờ sẽ huấn luyện mô hình dựa trên các biến đó

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
3

Đưa ra dự đoán

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
8

Đánh giá mô hình

# Importing all datasets
churn_data = pd.read_csv["./churn_data.csv"]
customer_data = pd.read_csv["./customer_data.csv"]
internet_data = pd.read_csv["./internet_data.csv"]
9

Vì vậy, hãy kiểm tra độ chính xác tổng thể.

#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']
0

Sự chính xác. 0. 8033175355450237
Nhạy cảm. 0. 845437616387337
độ đặc hiệu. 0. 6673346693386774

Đường cong ROC

Đường cong ROC thể hiện một số điều

  • Nó cho thấy sự đánh đổi giữa độ nhạy và độ đặc hiệu [bất kỳ sự gia tăng nào về độ nhạy sẽ đi kèm với sự giảm độ đặc hiệu]
  • Đường cong chạy theo đường viền bên trái và sau đó là đường viền trên cùng của không gian ROC càng gần thì phép thử càng chính xác
  • Đường cong càng gần với đường chéo 45 độ của không gian ROC, phép thử càng kém chính xác
#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']
1

Việc tìm ra xác suất ngưỡng tối ưu là thăm dò mà chúng tôi có được độ nhạy và độ đặc hiệu cân bằng.
Hãy tạo các cột có ngưỡng xác suất khác nhau

#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']
2

Bây giờ, hãy tính toán độ nhạy và độ đặc hiệu chính xác cho các ngưỡng xác suất khác nhau

#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']
3

Hãy vẽ biểu đồ độ nhạy và độ đặc hiệu chính xác cho các xác suất khác nhau

#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']
4

Từ đường cong trên, 0. 3 là điểm tối ưu để lấy làm xác suất ngưỡng

#Merging on 'customerID'
df_1 = pd.merge[churn_data, customer_data, how='inner', on='customerID']
#Final dataframe with all predictor variables
telecom = pd.merge[df_1, internet_data, how='inner', on='customerID']
5

Độ chính xác của mô hình. 0. 7502369668246446

Bạn có thể tìm thấy cách triển khai mã đầy đủ trên GitHub của tôi

Độ chính xác phân loại sẽ được sử dụng để đánh giá từng mô hình. Sau khi hoàn thành tất cả những điều này, một mô hình hồi quy logistic đã được tạo bằng Python bằng cách sử dụng hàm glm[] trong thư viện mô hình thống kê. Mô hình này chứa tất cả các biến, một số biến có hệ số không đáng kể; . Do đó, một số biến này đã bị loại bỏ dựa trên VIF và giá trị p

chú thích

Đọc thêm

  • Hồi quy logistic cho học máy
  • Hàm chi phí trong hồi quy logistic
  • Ước tính khả năng tối đa [MLE] cho Machine Learning

OK, vậy là xong, chúng ta đã hoàn thành. Nếu bạn có bất kỳ câu hỏi hoặc đề xuất nào, xin vui lòng bình luận. Tôi sẽ sớm đưa ra nhiều chủ đề về Machine Learning hơn

Hồi quy logistic có thể lấy các biến phân loại Python không?

Hồi quy logistic là một trong những thuật toán Machine Learning phổ biến nhất, được sử dụng trong kỹ thuật Supervised Machine Learning. Nó được sử dụng để dự đoán biến phụ thuộc phân loại, sử dụng một tập hợp các biến độc lập nhất định .

Làm cách nào để xử lý dữ liệu phân loại trong Python hồi quy logistic?

Hãy bắt đầu. .
Bước 1. Nhập thư viện Python
Bước 2. Khám phá và làm sạch dữ liệu
Bước 3. Chuyển đổi các biến phân loại. Tạo các biến giả
Bước 4. Phân tách tập dữ liệu đào tạo và kiểm tra
Bước #5. Chuyển đổi các biến số. mở rộng quy mô
Bước #6. Phù hợp với mô hình hồi quy logistic
Bước #7. Đánh giá mô hình

Hồi quy logistic Sklearn có thể xử lý các biến phân loại không?

Hồi quy logistic được sử dụng khi biến phụ thuộc là biến phân loại . Vì vậy, chúng ta có thể nói hồi quy logistic là mối quan hệ giữa một biến phân loại phụ thuộc với một hoặc nhiều biến danh nghĩa, thứ tự, khoảng. Scikit learn cung cấp chức năng "sklearn. linear_model.

Bạn có thể sử dụng hồi quy logistic cho các yếu tố dự đoán phân loại không?

Phân tích hồi quy logistic là một kỹ thuật thống kê để đánh giá mối quan hệ giữa các biến dự đoán khác nhau [phân loại hoặc liên tục] và kết quả là nhị phân [phân đôi].

Chủ Đề