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.preprocessing import StandardScaler from sklearn.neural_network import MLPClassifier, MLPRegressor from sklearn.metrics import accuracy_score, classification_report import matplotlib.pyplot as plt filename = "mobiles.csv" # Считываем данные из файла в DataFrame data = pd.read_csv(filename, sep=',') # Удаляем столбец с идентификатором data.pop("Id") # Приведение строковых значений признаков к численным при помощи векторайзера с суммированием 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'] # В X помещаем остальные признаки X = data.drop(columns='Price') # Разделение данных на обучающую (99%) и тестовую (1%) выборки X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.01, random_state=42) # Нормализация признаков scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) mlp = MLPClassifier( hidden_layer_sizes=(50, 50), # 2 скрытых слоя с 50 нейронами на каждом activation='relu', # функция активации alpha=0.01, # L2 штраф (регуляризация) max_iter=1000, # максимальное кол-во итераций random_state=42, # Random начало для воспроизведения результата verbose=True, # отображения итераций ) mlp.fit(X_train, y_train) # Предсказание на тестовых данных y_pred = mlp.predict(X_test) # Оценка производительности модели accuracy = accuracy_score(y_test, y_pred) # Вывод результатов print("Оценка работы модели MLPClassifier:") print(f'Accuracy: {accuracy}') plt.figure(1, figsize=(12, 7)) plt.title('Сравнение ожидаемых и фактических результатов предсказания цены телефона') plt.scatter(x=[i for i in range(len(X_test))], y=y_test, c='green', s=8) plt.scatter(x=[i for i in range(len(X_test))], y=y_pred, c='red', s=8) plt.savefig('plot_MLPClassifier.png') plt.show()