IIS_2023_1/mashkova_margarita_lab_5/main.py

57 lines
2.7 KiB
Python
Raw Normal View History

2023-11-25 03:25:33 +04:00
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.linear_model import Ridge
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)
# Гребневая регрессия
ridge = Ridge(alpha=1.0)
# Обучение модели
ridge.fit(X_train, y_train)
# Предсказание на тестовых данных
y_pred_ridge = ridge.predict(X_test)
# Оценка модели на тестовых данных (коэффициент детерминации)
ridge_score = ridge.score(X_test, y_test)
print("Оценка работы модели гребневой регрессии:")
print("Коэффициент детерминации: %f" % ridge_score)
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_ridge, c='red', s=8)
plt.savefig('plot.png')
plt.show()