Загрузите данные об оттоке телекоммуникационных компаний
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 ]])