Ml3b 3 practice
Классификация Практика¶
Классификация стоимости телефона¶
У вас есть датасет с параметрами мобильных телефонов. Переменная price_range отвечает за то, к какой категории относится телефон: 1 — дорогие, 0 — дешевые
Ваша задача состоит в том, чтобы наиболее точно научиться классифицировать телефоны по этим двум категориям на основании других параметров.
In [2]:
Copied!
import os
os.listdir()
import os
os.listdir()
Out[2]:
['ml3b_3.ipynb', 'train_mobile.csv', 'ml3b_2.ipynb']
In [6]:
Copied!
import pandas as pd
df = pd.read_csv('train_mobile.csv',delimiter=';')
df
import pandas as pd
df = pd.read_csv('train_mobile.csv',delimiter=';')
df
Out[6]:
battery_power | blue | clock_speed | dual_sim | fc | four_g | int_memory | m_dep | mobile_wt | n_cores | ... | px_height | px_width | ram | sc_h | sc_w | talk_time | three_g | touch_screen | wifi | price_range | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 842 | 0 | 2.2 | 0 | 1 | 0 | 7 | 0.6 | 188 | 2 | ... | 20 | 756 | 2549 | 9 | 7 | 19 | 0 | 0 | 1 | 0 |
1 | 1021 | 1 | 0.5 | 1 | 0 | 1 | 53 | 0.7 | 136 | 3 | ... | 905 | 1988 | 2631 | 17 | 3 | 7 | 1 | 1 | 0 | 1 |
2 | 563 | 1 | 0.5 | 1 | 2 | 1 | 41 | 0.9 | 145 | 5 | ... | 1263 | 1716 | 2603 | 11 | 2 | 9 | 1 | 1 | 0 | 1 |
3 | 615 | 1 | 2.5 | 0 | 0 | 0 | 10 | 0.8 | 131 | 6 | ... | 1216 | 1786 | 2769 | 16 | 8 | 11 | 1 | 0 | 0 | 1 |
4 | 1821 | 1 | 1.2 | 0 | 13 | 1 | 44 | 0.6 | 141 | 2 | ... | 1208 | 1212 | 1411 | 8 | 2 | 15 | 1 | 1 | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1995 | 794 | 1 | 0.5 | 1 | 0 | 1 | 2 | 0.8 | 106 | 6 | ... | 1222 | 1890 | 668 | 13 | 4 | 19 | 1 | 1 | 0 | 0 |
1996 | 1965 | 1 | 2.6 | 1 | 0 | 0 | 39 | 0.2 | 187 | 4 | ... | 915 | 1965 | 2032 | 11 | 10 | 16 | 1 | 1 | 1 | 1 |
1997 | 1911 | 0 | 0.9 | 1 | 1 | 1 | 36 | 0.7 | 108 | 8 | ... | 868 | 1632 | 3057 | 9 | 1 | 5 | 1 | 1 | 0 | 1 |
1998 | 1512 | 0 | 0.9 | 0 | 4 | 1 | 46 | 0.1 | 145 | 5 | ... | 336 | 670 | 869 | 18 | 10 | 19 | 1 | 1 | 1 | 0 |
1999 | 510 | 1 | 2.0 | 1 | 5 | 1 | 45 | 0.9 | 168 | 6 | ... | 483 | 754 | 3919 | 19 | 4 | 2 | 1 | 1 | 1 | 1 |
2000 rows × 21 columns
Коррелирующийся признаки:
ram
(0.822),battery_power
(0.149),px_width
(0.117),px_height
(0.098)touch_screen
(0.04)
In [14]:
Copied!
most_corr = list(df.corr()['price_range'].abs().sort_values(ascending=False)[:6].index[1:])
most_corr
most_corr = list(df.corr()['price_range'].abs().sort_values(ascending=False)[:6].index[1:])
most_corr
Out[14]:
['ram', 'battery_power', 'px_width', 'px_height', 'touch_screen']
Задание 3B.3.2¶
Теперь необходимо обучить алгоритм. Для начала разбейте выборку на тестовую и обучающую, размер тестовой задайте 0.2. Параметр random_state=31. В качестве модели возьмите логистическую регрессию. В качестве предикторов возьмите пять ранее отобранных признаков.
Рассчитайте метрику, которая покажет
- какая доля телефонов, обозначенных классификатором как дорогие, действительно относится к этой категории.
- Это precision (точность)
Задание 3B.3.3¶
Введите полученное значение
In [4]:
Copied!
from sklearn.model_selection import train_test_split as tts
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score as precision
y = df['price_range'].copy()
X = df.drop(['price_range'],axis=1)
X = X[most_corr]
X
from sklearn.model_selection import train_test_split as tts
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score as precision
y = df['price_range'].copy()
X = df.drop(['price_range'],axis=1)
X = X[most_corr]
X
Out[4]:
ram | battery_power | px_width | px_height | touch_screen | |
---|---|---|---|---|---|
0 | 2549 | 842 | 756 | 20 | 0 |
1 | 2631 | 1021 | 1988 | 905 | 1 |
2 | 2603 | 563 | 1716 | 1263 | 1 |
3 | 2769 | 615 | 1786 | 1216 | 0 |
4 | 1411 | 1821 | 1212 | 1208 | 1 |
... | ... | ... | ... | ... | ... |
1995 | 668 | 794 | 1890 | 1222 | 1 |
1996 | 2032 | 1965 | 1965 | 915 | 1 |
1997 | 3057 | 1911 | 1632 | 868 | 1 |
1998 | 869 | 1512 | 670 | 336 | 1 |
1999 | 3919 | 510 | 754 | 483 | 1 |
2000 rows × 5 columns
In [9]:
Copied!
X_train,X_test,y_train,y_test = tts(X,y,test_size=0.2,random_state=31)
model = LogisticRegression(random_state=31)
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
print(f'precision: {round(precision(y_test,y_pred),4)}')
X_train,X_test,y_train,y_test = tts(X,y,test_size=0.2,random_state=31)
model = LogisticRegression(random_state=31)
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
print(f'precision: {round(precision(y_test,y_pred),4)}')
precision: 0.9859