Подберите количество лучших признаков для модели SVC(). Выведите на экран количество признаков, значение переменной acc1, accuracy при разном количестве признаков и количество сэкономленных средств компании.
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.metrics import accuracy_score
from sklearn.feature_selection import SelectKBest, f_classif
RANDOM_STATE = 77
scaler = StandardScaler()
test_data = pd.read_csv('orders_seafood_new.csv')
data = pd.read_csv('orders_seafood_test.csv')
# объединяем исходный и новый датасеты
all_data = pd.concat([data,test_data],axis=0)
X = all_data.drop(columns=['target', 'client_id'])
y = all_data['target']
# делим данные на выборки
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.25, random_state=RANDOM_STATE)
# добавляем полиномиальные признаки
poly = PolynomialFeatures(2)
X_train = poly.fit_transform(X_train)
X_test = poly.transform(X_test)
#сохранение первоначального вида таблицы X_test с полиномиальными признаками
X_test_df = pd.DataFrame(X_test,columns = poly.get_feature_names())
# стандартизируем признаки
X_train_scalled = pd.DataFrame(scaler.fit_transform(X_train),columns = poly.get_feature_names())
X_test_scalled = pd.DataFrame(scaler.transform(X_test),columns = poly.get_feature_names())
# обучим модель, выведем её accuracy
model = SVC()
model.fit(X_train_scalled, y_train)
acc1 = accuracy_score(y_test, model.predict(X_test_scalled))
# объявляем селектор
# он будет подбирать разное количество признаков за счёт цикла
# обучите модель с разным числом признаков и сравните их точность с базовой моделью
for i in range(len(X_test_df.columns)):
selector = SelectKBest(f_classif, k=i+1)
selector.fit(X_train_scalled, y_train)
features_names = X_train_scalled.columns[selector.get_support(indices=True)]
X_train_new = X_train_scalled[list(features_names)]
X_test_new = X_test_scalled[list(features_names)]
model = SVC(kernel = 'rbf')
model.fit(X_train_new, y_train)
acc_new = accuracy_score(y_test, model.predict(X_test_new))
predicts = X_test_df[['x3']].copy()
predicts['svm'] = model.predict(X_test_new)
predicts['y_test'] = y_test.tolist()
TP = predicts[(predicts['svm']==1)&(predicts['y_test']==1)]['x3'].sum()*0.7*0.8
FP = predicts[(predicts['svm']==1)&(predicts['y_test']==0)]['x3'].sum()*0.2
print(i+1, acc1, acc_new, TP-FP)
Результат
1 0.675531914893617 0.601063829787234 763876.8199999998
2 0.675531914893617 0.601063829787234 763876.8199999998
3 0.675531914893617 0.601063829787234 763876.8199999998
4 0.675531914893617 0.601063829787234 763876.8199999998
5 0.675531914893617 0.601063829787234 763876.8199999998
6 0.675531914893617 0.601063829787234 763876.8199999998
7 0.675531914893617 0.601063829787234 763876.8199999998
8 0.675531914893617 0.601063829787234 763876.8199999998
9 0.675531914893617 0.601063829787234 763876.8199999998
10 0.675531914893617 0.6542553191489362 780225.056
11 0.675531914893617 0.6542553191489362 780225.056
12 0.675531914893617 0.6542553191489362 780225.056
13 0.675531914893617 0.6542553191489362 780225.056
14 0.675531914893617 0.6542553191489362 780225.056
15 0.675531914893617 0.6542553191489362 780225.056
16 0.675531914893617 0.6542553191489362 780225.056
17 0.675531914893617 0.6542553191489362 780225.056
18 0.675531914893617 0.6648936170212766 782429.856
19 0.675531914893617 0.6702127659574468 783410.0360000001
20 0.675531914893617 0.675531914893617 784750.956
21 0.675531914893617 0.675531914893617 784750.956