import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import mean_squared_error filename = "mobiles.csv" # Считываем данные из файла в DataFrame data = pd.read_csv(filename, sep=',') # Удаляем столбец с идентификатором data.pop("Id") # print(data) # data.info() # Приведение строковых значений признаков к численным при помощи векторайзера с суммированием FEATURE_COLUMNS_TO_PROC = ['Name', 'Brand', 'Model', 'Operating system'] for column_name in FEATURE_COLUMNS_TO_PROC: vectorizer = TfidfVectorizer() train_text_feature_matrix = vectorizer.fit_transform(data[column_name]).toarray() a = pd.DataFrame(train_text_feature_matrix) data[column_name] = a[a.columns[1:]].apply(lambda x: sum(x.dropna().astype(float)), axis = 1) # Приведение строковых значений к численным при помощи числового кодирования LabelEncoder le = LabelEncoder() data['Touchscreen'] = le.fit_transform(data['Touchscreen']) data['Wi-Fi'] = le.fit_transform(data['Wi-Fi']) data['Bluetooth'] = le.fit_transform(data['Bluetooth']) data['GPS'] = le.fit_transform(data['GPS']) data['3G'] = le.fit_transform(data['3G']) data['4G/ LTE'] = le.fit_transform(data['4G/ LTE']) # Разделение данных на обучающую и тестовую выборки # В Y помещаем целевой признак - цену Y = data['Price'] def predict(X): # Размер обучающей выборки - 99%, тестовой - 1% X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.01, random_state=42) # Создание и обучение модели DecisionTreeClassifier dtc = DecisionTreeClassifier(max_depth=5, random_state=241) dtc.fit(X_train, y_train) # Создание DataFrame с именами признаков и их важностью feature_importance_df = pd.DataFrame({'Признак': X_train.columns, 'Важность': dtc.feature_importances_}) \ .sort_values(by='Важность', ascending=False) print("Важность признаков:") print(feature_importance_df) mean_accuracy = dtc.score(X_test, y_test) y_pred = dtc.predict(X_test) mse = mean_squared_error(y_test, y_pred) print(f"Среднеквадратичная ошибка: {mse}") print(f"Средняя точность: {mean_accuracy}") return feature_importance_df print("\n***Решение задачи классификации, используя все параметры***") # В Х помещаем все признаки, кроме цены X = data.drop(columns='Price') importance_df = predict(X) print("\n***Решение задачи классификации, используя только 4 значимых параметра***") # Выбираем только 4 значимых признака important_features = importance_df.iloc[:4, 0].tolist() X_important = data[important_features] predict(X_important)