73 lines
3.4 KiB
Python
73 lines
3.4 KiB
Python
|
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()
|