IIS_2023_1/mashkova_margarita_lab_6/main.py

73 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()