69 lines
3.3 KiB
Python
69 lines
3.3 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.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)
|