Найти тему

Логистическая регрессия с Python Урок 2

Загрузите данные об оттоке телекоммуникационных компаний

Telco Churn - это файл с гипотетическими данными, который касается усилий телекоммуникационной компании по сокращению текучести своей клиентской базы. Каждый случай соответствует отдельному клиенту и записывает различную демографическую информацию и информацию об использовании услуг. Прежде чем вы сможете работать с данными, вы должны использовать URL-адрес для получения ChurnData.csv.

Чтобы загрузить данные, мы будем использовать! Wget, чтобы загрузить их из IBM Object Storage.

In [2]: here and press Shift+Enter

!wget -O ChurnData.csv https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%203/data/ChurnData.csv

--2020-10-12 14:15:41-- https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%203/data/ChurnData.csv

Resolving cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)... 169.63.118.104

Connecting to cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud (cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud)|169.63.118.104|:443... connected.

HTTP request sent, awaiting response... 200 OK

Length: 35943 (35K) [text/csv]

Saving to: ‘ChurnData.csv’

ChurnData.csv 100%[===================>] 35.10K --.-KB/s in 0.02s

2020-10-12 14:15:41 (1.89 MB/s) - ‘ChurnData.csv’ saved [35943/35943]

Практика

Сколько всего строк и столбцов в этом наборе данных? Как называются столбцы?

In [5]:

# write your code here

churn_df.shape

Out[5]:

(200, 10)

Lets define X, and y for our dataset:

In [6]:

X = np.asarray(churn_df[['tenure', 'age', 'address', 'income', 'ed', 'employ', 'equip']])

X[0:5]

Out[6]:

array([[ 11., 33., 7., 136., 5., 5., 0.],

[ 33., 33., 12., 33., 2., 0., 0.],

[ 23., 30., 9., 30., 1., 2., 0.],

[ 38., 35., 5., 76., 2., 10., 1.],

[ 7., 35., 14., 80., 2., 15., 0.]])

In [9]:

y = np.asarray(churn_df['churn'])

y [0:5]

Out[9]:

array([1, 1, 0, 0, 0])

Also, we normalize the dataset:

In [10]:

from sklearn import preprocessing

X = preprocessing.StandardScaler().fit(X).transform(X)

X[0:5]

Out[10]:

array([[-1.13518441, -0.62595491, -0.4588971 , 0.4751423 , 1.6961288 ,

-0.58477841, -0.85972695],

[-0.11604313, -0.62595491, 0.03454064, -0.32886061, -0.6433592 ,

-1.14437497, -0.85972695],

[-0.57928917, -0.85594447, -0.261522 , -0.35227817, -1.42318853,

-0.92053635, -0.85972695],

[ 0.11557989, -0.47262854, -0.65627219, 0.00679109, -0.6433592 ,

-0.02518185, 1.16316 ],

[-1.32048283, -0.47262854, 0.23191574, 0.03801451, -0.6433592 ,

0.53441472, -0.85972695]])

Моделирование (логистическая регрессия с помощью Scikit-learn)

Давайте построим нашу модель, используя LogisticRegression из пакета Scikit-learn. Эта функция реализует логистическую регрессию и может использовать различные численные оптимизаторы для поиска параметров, в том числе решатели «newton-cg», «lbfgs», «liblinear», «sag», «saga». Вы можете найти подробную информацию о плюсах и минусах этих оптимизаторов, если поищете ее в Интернете.

Версия логистической регрессии в Scikit-learn, поддерживает регуляризацию. Регуляризация - это метод, используемый для решения проблемы переобучения в моделях машинного обучения. Параметр C указывает обратную силу регуляризации, которая должна быть положительным числом с плавающей запятой. Меньшие значения указывают на более сильную регуляризацию. Теперь давайте подгоним нашу модель к набору поездов:

from sklearn.linear_model importLogisticRegression

from sklearn.metrics import confusion_matrix

LR = LogisticRegression(C=0.01, solver='liblinear').fit(X_train,y_train)

LR

Out[12]:

LogisticRegression(C=0.01, class_weight=None, dual=False, fit_intercept=True,

intercept_scaling=1, max_iter=100, multi_class='warn',

n_jobs=None, penalty='l2', random_state=None, solver='liblinear',

tol=0.0001, verbose=0, warm_start=False)

Now we can predict using our test set:

In [13]:

yhat = LR.predict(X_test)

yhat

Out[13]:

array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0])

predict_proba returns estimates for all classes, ordered by the label of classes. So, the first column is the probability of class 1, P(Y=1|X), and second column is probability of class 0, P(Y=0|X):

In [14]:

yhat_prob = LR.predict_proba(X_test)

yhat_prob

Out[14]:

array([[0.54132919, 0.45867081],

[0.60593357, 0.39406643],

[0.56277713, 0.43722287],

[0.63432489, 0.36567511],

[0.56431839, 0.43568161],

[0.55386646, 0.44613354],

[0.52237207, 0.47762793],

[0.60514349, 0.39485651],

[0.41069572, 0.58930428],

[0.6333873 , 0.3666127 ],

[0.58068791, 0.41931209],

[0.62768628, 0.37231372],

[0.47559883, 0.52440117],

[0.4267593 , 0.5732407 ],

[0.66172417, 0.33827583],

[0.55092315, 0.44907685],

[0.51749946, 0.48250054],

[0.485743 , 0.514257 ],

[0.49011451, 0.50988549],

[0.52423349, 0.47576651],

[0.61619519, 0.38380481],

[0.52696302, 0.47303698],

[0.63957168, 0.36042832],

[0.52205164, 0.47794836],

[0.50572852, 0.49427148],

[0.70706202, 0.29293798],

[0.55266286, 0.44733714],

[0.52271594, 0.47728406],

[0.51638863, 0.48361137],

[0.71331391, 0.28668609],

[0.67862111, 0.32137889],

[0.50896403, 0.49103597],

[0.42348082, 0.57651918],

[0.71495838, 0.28504162],

[0.59711064, 0.40288936],

[0.63808839, 0.36191161],

[0.39957895, 0.60042105],

[0.52127638, 0.47872362],

[0.65975464, 0.34024536],

[0.5114172 , 0.4885828 ]])