Compare commits
45 Commits
alexandrov
...
senkin_ale
| Author | SHA1 | Date | |
|---|---|---|---|
| 09b9bfc730 | |||
| a98d914e7c | |||
| a4985e4d76 | |||
| 3bb04b059b | |||
| a9e1145b0e | |||
| f44ba0d0a2 | |||
| ccf3bfb561 | |||
| 4f349a1d49 | |||
| f8075403a3 | |||
| c20695af79 | |||
| 33dba33cc4 | |||
| 41e0e8598f | |||
| 53a25975f9 | |||
| 5e00a83340 | |||
| 2239c15572 | |||
| 07333219ed | |||
| 5891b16f9d | |||
| 81874f0f84 | |||
| ce6105bee6 | |||
| ca3b734361 | |||
| 2f1d67dc8f | |||
| b9ec1fd145 | |||
| f84f7abaa9 | |||
| 5445cef67d | |||
| b967af636c | |||
| ad60c6221e | |||
|
|
8942f824d5 | ||
| 106e02f76b | |||
|
|
abd650a641 | ||
| 15936c6996 | |||
|
|
c03b5e3a94 | ||
| 16db685d3d | |||
| 84fe84a15a | |||
| 7ccd400417 | |||
|
|
c15ab42cd4 | ||
| 5eb35fe26d | |||
|
|
ef485bf514 | ||
|
|
3a868e5545 | ||
| fc2fe74052 | |||
| 35826f2461 | |||
| 7781a379c3 | |||
| adca415462 | |||
| 72507eb3af | |||
| 516c7aea4f | |||
|
|
f11ba4d365 |
7
.idea/discord.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="ASK" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
</project>
|
||||
3
.idea/misc.xml
generated
@@ -1,4 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (venv)" project-jdk-type="Python SDK" />
|
||||
<component name="PyCharmProfessionalAdvertiser">
|
||||
<option name="shown" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
32
.idea/workspace.xml
generated
@@ -1,7 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="AutoImportSettings">
|
||||
<option name="autoReloadType" value="SELECTIVE" />
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="" />
|
||||
<list default="true" id="0ceb130e-88da-4a20-aad6-17f5ab4226ac" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
|
||||
@@ -15,23 +20,32 @@
|
||||
</option>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
<option name="RECENT_BRANCH_BY_REPOSITORY">
|
||||
<map>
|
||||
<entry key="$PROJECT_DIR$" value="main" />
|
||||
</map>
|
||||
</option>
|
||||
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="MarkdownSettingsMigration">
|
||||
<option name="stateVersion" value="1" />
|
||||
</component>
|
||||
<component name="ProjectColorInfo">{
|
||||
"associatedIndex": 2
|
||||
}</component>
|
||||
<component name="ProjectId" id="2VlZqWiOX68aCf0o2y0AtYJWURS" />
|
||||
<component name="ProjectViewState">
|
||||
<option name="hideEmptyMiddlePackages" value="true" />
|
||||
<option name="showLibraryContents" value="true" />
|
||||
</component>
|
||||
<component name="PropertiesComponent"><![CDATA[{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"last_opened_file_path": "D:/ulstukek/Course4/IIS/labs"
|
||||
<component name="PropertiesComponent">{
|
||||
"keyToString": {
|
||||
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
||||
"RunOnceActivity.ShowReadmeOnStart": "true",
|
||||
"last_opened_file_path": "D:/ulstukek/Course4/IIS/labs",
|
||||
"settings.editor.selected.configurable": "reference.settings.ide.settings.new.ui"
|
||||
}
|
||||
}]]></component>
|
||||
}</component>
|
||||
<component name="RecentsManager">
|
||||
<key name="CopyFile.RECENT_KEYS">
|
||||
<recent name="D:\ulstukek\Course4\IIS\IISLabs\IIS_2023_1\zavrazhnova_svetlana_lab_3" />
|
||||
@@ -104,9 +118,11 @@
|
||||
</configuration>
|
||||
<recent_temporary>
|
||||
<list>
|
||||
<item itemvalue="Python.zavrazhnova_svetlana_lab3_2" />
|
||||
<item itemvalue="Python.zavrazhnova_svetlana_lab_3_1" />
|
||||
<item itemvalue="Python.zavrazhnova_svetlana_lab_2" />
|
||||
<item itemvalue="Python.zavrazhnova_svetlana_lab3_2" />
|
||||
<item itemvalue="Python.zavrazhnova_svetlana_lab3_2" />
|
||||
<item itemvalue="Python.zavrazhnova_svetlana_lab_3_1" />
|
||||
</list>
|
||||
</recent_temporary>
|
||||
</component>
|
||||
|
||||
47
abanin_daniil_lab_1/README.md
Normal file
@@ -0,0 +1,47 @@
|
||||
## Лабораторная работа №1
|
||||
|
||||
### Работа с типовыми наборами данных и различными моделями
|
||||
|
||||
### ПИбд-41 Абанин Даниил
|
||||
|
||||
### Как запустить лабораторную работу:
|
||||
|
||||
* установить python, numpy, matplotlib, sklearn
|
||||
* запустить проект (стартовая точка класс lab1)
|
||||
|
||||
### Какие технологии использовались:
|
||||
|
||||
* Язык программирования `Python`,
|
||||
* Библиотеки numpy, matplotlib, sklearn
|
||||
* Среда разработки `PyCharm`
|
||||
|
||||
### Что делает лабораторная работа:
|
||||
|
||||
* Программа гененерирует данные с make_moonsmake_moons (noise=0.3, random_state=rs)
|
||||
* Сравнивает три типа моделей: инейная, полиномиальная, гребневая полиномиальная регрессии
|
||||
|
||||
### Примеры работы:
|
||||
|
||||
#### Результаты:
|
||||
MAE - средняя абсолютная ошибка, измеряет среднюю абсолютную разницу между прогнозируемыми значениями модели и фактическими значениями целевой переменной
|
||||
MSE - средняя квадратическая ошибка, измеряет среднюю квадратичную разницу между прогнозируемыми значениями модели и фактическими значениями целевой переменной
|
||||
|
||||
Чем меньше значения показателей, тем лучше модель справляется с предсказанием
|
||||
|
||||
Линейная регрессия
|
||||
MAE 0.2959889435199454
|
||||
MSE 0.13997968555679302
|
||||
|
||||
Полиномиальная регрессия
|
||||
MAE 0.21662135861071705
|
||||
MSE 0.08198825629271855
|
||||
|
||||
Гребневая полиномиальная регрессия
|
||||
MAE 0.2102788716636562
|
||||
MSE 0.07440133949387796
|
||||
|
||||
Лучший результат показала модель **Гребневая полиномиальная регрессия**
|
||||
|
||||

|
||||

|
||||

|
||||
BIN
abanin_daniil_lab_1/greb_reg.jpg
Normal file
|
After Width: | Height: | Size: 59 KiB |
66
abanin_daniil_lab_1/lab1.py
Normal file
@@ -0,0 +1,66 @@
|
||||
from matplotlib import pyplot as plt
|
||||
from matplotlib.colors import ListedColormap
|
||||
from sklearn.linear_model import LinearRegression, Ridge
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.pipeline import Pipeline
|
||||
from sklearn.preprocessing import PolynomialFeatures
|
||||
from sklearn.datasets import make_moons
|
||||
from sklearn import metrics
|
||||
|
||||
cm_bright = ListedColormap(['#8B0000', '#FF0000'])
|
||||
cm_bright1 = ListedColormap(['#FF4500', '#FFA500'])
|
||||
|
||||
|
||||
def create_moons():
|
||||
x, y = make_moons(noise=0.3, random_state=0)
|
||||
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=.4, random_state=42)
|
||||
|
||||
linear_regretion(X_train, X_test, y_train, y_test)
|
||||
polynomial_regretion(X_train, X_test, y_train, y_test)
|
||||
ridge_regretion(X_train, X_test, y_train, y_test)
|
||||
|
||||
|
||||
def linear_regretion(x_train, x_test, y_train, y_test):
|
||||
model = LinearRegression().fit(x_train, y_train)
|
||||
y_predict = model.intercept_ + model.coef_ * x_test
|
||||
plt.title('Линейная регрессия')
|
||||
print('Линейная регрессия')
|
||||
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=cm_bright)
|
||||
plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test, cmap=cm_bright1, alpha=0.7)
|
||||
plt.plot(x_test, y_predict, color='red')
|
||||
print('MAE', metrics.mean_absolute_error(y_test, y_predict[:, 1]))
|
||||
print('MSE', metrics.mean_squared_error(y_test, y_predict[:, 1]))
|
||||
plt.show()
|
||||
|
||||
|
||||
def polynomial_regretion(x_train, x_test, y_train, y_test):
|
||||
polynomial_features = PolynomialFeatures(degree=3)
|
||||
X_polynomial = polynomial_features.fit_transform(x_train, y_train)
|
||||
base_model = LinearRegression()
|
||||
base_model.fit(X_polynomial, y_train)
|
||||
y_predict = base_model.predict(X_polynomial)
|
||||
plt.title('Полиномиальная регрессия')
|
||||
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=cm_bright)
|
||||
plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test, cmap=cm_bright1, alpha=0.7)
|
||||
plt.plot(x_train, y_predict, color='blue')
|
||||
plt.show()
|
||||
print('Полиномиальная регрессия')
|
||||
print('MAE', metrics.mean_absolute_error(y_train, y_predict))
|
||||
print('MSE', metrics.mean_squared_error(y_train, y_predict))
|
||||
|
||||
|
||||
def ridge_regretion(X_train, X_test, y_train, y_test):
|
||||
model = Pipeline([('poly', PolynomialFeatures(degree=3)), ('ridge', Ridge(alpha=1.0))])
|
||||
model.fit(X_train, y_train)
|
||||
y_predict = model.predict(X_test)
|
||||
plt.title('Гребневая полиномиальная регрессия')
|
||||
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright1, alpha=0.7)
|
||||
plt.plot(X_test, y_predict, color='blue')
|
||||
plt.show()
|
||||
print('Гребневая полиномиальная регрессия')
|
||||
print('MAE', metrics.mean_absolute_error(y_test, y_predict))
|
||||
print('MSE', metrics.mean_squared_error(y_test, y_predict))
|
||||
|
||||
|
||||
create_moons()
|
||||
BIN
abanin_daniil_lab_1/lin_reg.jpg
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
abanin_daniil_lab_1/pol_reg.jpg
Normal file
|
After Width: | Height: | Size: 63 KiB |
41
abanin_daniil_lab_2/README.md
Normal file
@@ -0,0 +1,41 @@
|
||||
## Лабораторная работа №2
|
||||
|
||||
### Ранжирование признаков
|
||||
|
||||
## ПИбд-41 Абанин Даниил
|
||||
|
||||
### Как запустить лабораторную работу:
|
||||
|
||||
* установить python, numpy, matplotlib, sklearn
|
||||
* запустить проект (стартовая точка lab2)
|
||||
|
||||
### Какие технологии использовались:
|
||||
|
||||
* Язык программирования `Python`, библиотеки numpy, matplotlib, sklearn
|
||||
* Среда разработки `PyCharm`
|
||||
|
||||
### Что делает лабораторная работа:
|
||||
|
||||
* Генерирует данные и обучает такие модели, как: LinearRegression, RandomizedLasso, Recursive Feature Elimination (RFE)
|
||||
* Производиться ранжирование признаков с помощью моделей LinearRegression, RandomizedLasso, Recursive Feature Elimination (RFE)
|
||||
* Отображение получившихся результатов: 4 самых важных признака по среднему значению, значения признаков для каждой модели
|
||||
|
||||
|
||||
### 4 самых важных признака по среднему значению
|
||||
* Параметр - x4, значение - 0.56
|
||||
* Параметр - x1, значение - 0.45
|
||||
* Параметр - x2, значение - 0.33
|
||||
* Параметр - x9, значение - 0.33
|
||||
|
||||
####Linear Regression
|
||||
[('x1', 1.0), ('x4', 0.69), ('x2', 0.61), ('x11', 0.59), ('x3', 0.51), ('x13', 0.48), ('x5', 0.19), ('x12', 0.19), ('x14', 0.12), ('x8', 0.03), ('x6', 0.02), ('x10', 0.01), ('x7', 0.0), ('x9', 0.0)]
|
||||
|
||||
####Recursive Feature Elimination
|
||||
[('x9', 1.0), ('x7', 0.86), ('x10', 0.71), ('x6', 0.57), ('x8', 0.43), ('x14', 0.29), ('x12', 0.14), ('x1', 0.0), ('x2', 0.0), ('x3', 0.0), ('x4', 0.0), ('x5', 0.0), ('x11', 0.0), ('x13', 0.0)]
|
||||
|
||||
####Randomize Lasso
|
||||
[('x4', 1.0), ('x2', 0.37), ('x1', 0.36), ('x5', 0.32), ('x6', 0.02), ('x8', 0.02), ('x3', 0.01), ('x7', 0.0), ('x9', 0.0), ('x10', 0.0), ('x11', 0.0), ('x12', 0.0), ('x13', 0.0), ('x14', 0.0)]
|
||||
|
||||
#### Результаты:
|
||||
|
||||

|
||||
76
abanin_daniil_lab_2/RadomizedLasso.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from sklearn.utils import check_X_y, check_random_state
|
||||
from sklearn.linear_model import Lasso
|
||||
from scipy.sparse import issparse
|
||||
from scipy import sparse
|
||||
|
||||
|
||||
def _rescale_data(x, weights):
|
||||
if issparse(x):
|
||||
size = weights.shape[0]
|
||||
weight_dia = sparse.dia_matrix((1 - weights, 0), (size, size))
|
||||
x_rescaled = x * weight_dia
|
||||
else:
|
||||
x_rescaled = x * (1 - weights)
|
||||
|
||||
return x_rescaled
|
||||
|
||||
|
||||
class RandomizedLasso(Lasso):
|
||||
"""
|
||||
Randomized version of scikit-learns Lasso class.
|
||||
|
||||
Randomized LASSO is a generalization of the LASSO. The LASSO penalises
|
||||
the absolute value of the coefficients with a penalty term proportional
|
||||
to `alpha`, but the randomized LASSO changes the penalty to a randomly
|
||||
chosen value in the range `[alpha, alpha/weakness]`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
weakness : float
|
||||
Weakness value for randomized LASSO. Must be in (0, 1].
|
||||
|
||||
See also
|
||||
--------
|
||||
sklearn.linear_model.LogisticRegression : learns logistic regression models
|
||||
using the same algorithm.
|
||||
"""
|
||||
def __init__(self, weakness=0.5, alpha=1.0, fit_intercept=True,
|
||||
precompute=False, copy_X=True, max_iter=1000,
|
||||
tol=1e-4, warm_start=False, positive=False,
|
||||
random_state=None, selection='cyclic'):
|
||||
self.weakness = weakness
|
||||
super(RandomizedLasso, self).__init__(
|
||||
alpha=alpha, fit_intercept=fit_intercept, precompute=precompute, copy_X=copy_X,
|
||||
max_iter=max_iter, tol=tol, warm_start=warm_start,
|
||||
positive=positive, random_state=random_state,
|
||||
selection=selection)
|
||||
|
||||
def fit(self, X, y):
|
||||
"""Fit the model according to the given training data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
X : {array-like, sparse matrix}, shape = [n_samples, n_features]
|
||||
The training input samples.
|
||||
|
||||
y : array-like, shape = [n_samples]
|
||||
The target values.
|
||||
"""
|
||||
if not isinstance(self.weakness, float) or not (0.0 < self.weakness <= 1.0):
|
||||
raise ValueError('weakness should be a float in (0, 1], got %s' % self.weakness)
|
||||
|
||||
X, y = check_X_y(X, y, accept_sparse=True)
|
||||
|
||||
n_features = X.shape[1]
|
||||
weakness = 1. - self.weakness
|
||||
random_state = check_random_state(self.random_state)
|
||||
|
||||
weights = weakness * random_state.randint(0, 1 + 1, size=(n_features,))
|
||||
|
||||
# TODO: I am afraid this will do double normalization if set to true
|
||||
#X, y, _, _ = _preprocess_data(X, y, self.fit_intercept, normalize=self.normalize, copy=False,
|
||||
# sample_weight=None, return_mean=False)
|
||||
|
||||
# TODO: Check if this is a problem if it happens before standardization
|
||||
X_rescaled = _rescale_data(X, weights)
|
||||
return super(RandomizedLasso, self).fit(X_rescaled, y)
|
||||
BIN
abanin_daniil_lab_2/__pycache__/RadomizedLasso.cpython-39.pyc
Normal file
81
abanin_daniil_lab_2/lab2.py
Normal file
@@ -0,0 +1,81 @@
|
||||
from matplotlib import pyplot as plt
|
||||
from sklearn.linear_model import LinearRegression
|
||||
from RadomizedLasso import RandomizedLasso
|
||||
from sklearn.feature_selection import RFE
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
import numpy as np
|
||||
|
||||
names = ["x%s" % i for i in range(1, 15)]
|
||||
|
||||
|
||||
def start_point():
|
||||
X,Y = generation_data()
|
||||
# Линейная модель
|
||||
lr = LinearRegression()
|
||||
lr.fit(X, Y)
|
||||
# Рекурсивное сокращение признаков
|
||||
rfe = RFE(lr)
|
||||
rfe.fit(X, Y)
|
||||
# Случайное Лассо
|
||||
randomized_lasso = RandomizedLasso(alpha=.01)
|
||||
randomized_lasso.fit(X, Y)
|
||||
|
||||
ranks = {"Linear Regression": rank_to_dict(lr.coef_), "Recursive Feature Elimination": rank_to_dict(rfe.ranking_),
|
||||
"Randomize Lasso": rank_to_dict(randomized_lasso.coef_)}
|
||||
|
||||
get_estimation(ranks)
|
||||
print_sorted_data(ranks)
|
||||
|
||||
|
||||
def generation_data():
|
||||
np.random.seed(0)
|
||||
size = 750
|
||||
X = np.random.uniform(0, 1, (size, 14))
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
|
||||
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1))
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
|
||||
return X, Y
|
||||
|
||||
|
||||
def rank_to_dict(ranks):
|
||||
ranks = np.abs(ranks)
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
return dict(zip(names, ranks))
|
||||
|
||||
|
||||
def get_estimation(ranks: {}):
|
||||
mean = {}
|
||||
#«Бежим» по списку ranks
|
||||
for key, value in ranks.items():
|
||||
for item in value.items():
|
||||
if(item[0] not in mean):
|
||||
mean[item[0]] = 0
|
||||
mean[item[0]] += item[1]
|
||||
|
||||
for key, value in mean.items():
|
||||
res = value/len(ranks)
|
||||
mean[key] = round(res, 2)
|
||||
|
||||
mean_sorted = sorted(mean.items(), key=lambda item: item[1], reverse=True)
|
||||
print("Средние значения")
|
||||
print(mean_sorted)
|
||||
|
||||
|
||||
print("4 самых важных признака по среднему значению")
|
||||
for item in mean_sorted[:4]:
|
||||
print('Параметр - {0}, значение - {1}'.format(item[0], item[1]))
|
||||
|
||||
|
||||
|
||||
def print_sorted_data(ranks: {}):
|
||||
print()
|
||||
for key, value in ranks.items():
|
||||
ranks[key] = sorted(value.items(), key=lambda item: item[1], reverse=True)
|
||||
for key, value in ranks.items():
|
||||
print(key)
|
||||
print(value)
|
||||
|
||||
|
||||
start_point()
|
||||
BIN
abanin_daniil_lab_2/result.png
Normal file
|
After Width: | Height: | Size: 178 KiB |
40
alexandrov_dmitrii_lab_4/lab4.py
Normal file
@@ -0,0 +1,40 @@
|
||||
from scipy.cluster import hierarchy
|
||||
import pandas as pd
|
||||
from matplotlib import pyplot as plt
|
||||
|
||||
|
||||
def start():
|
||||
data = pd.read_csv('sberbank_data.csv', index_col='id')
|
||||
x = data[['full_sq', 'price_doc']]
|
||||
plt.figure(1, figsize=(16, 9))
|
||||
plt.title('Дендрограмма кластеризации цен')
|
||||
|
||||
prices = [0, 0, 0, 0]
|
||||
for ind, val in x.iterrows():
|
||||
val = val['price_doc'] / val['full_sq']
|
||||
if val < 100000:
|
||||
prices[0] = prices[0] + 1
|
||||
elif val < 300000:
|
||||
prices[1] = prices[1] + 1
|
||||
elif val < 500000:
|
||||
prices[2] = prices[2] + 1
|
||||
else:
|
||||
prices[3] = prices[3] + 1
|
||||
print('Результаты подчсёта ручного распределения:')
|
||||
print('низких цен:'+str(prices[0]))
|
||||
print('средних цен:'+str(prices[1]))
|
||||
print('высоких цен:'+str(prices[2]))
|
||||
print('премиальных цен:'+str(prices[3]))
|
||||
|
||||
hierarchy.dendrogram(hierarchy.linkage(x, method='single'),
|
||||
truncate_mode='lastp',
|
||||
p=15,
|
||||
orientation='top',
|
||||
leaf_rotation=90,
|
||||
leaf_font_size=8,
|
||||
show_contracted=True)
|
||||
|
||||
plt.show()
|
||||
|
||||
|
||||
start()
|
||||
27
alexandrov_dmitrii_lab_4/readme.md
Normal file
@@ -0,0 +1,27 @@
|
||||
### Задание
|
||||
Использовать метод кластеризации по варианту для выбранных данных по варианту, самостоятельно сформулировав задачу.
|
||||
Интерпретировать результаты и оценить, насколько хорошо он подходит для
|
||||
решения сформулированной вами задачи.
|
||||
|
||||
Вариант 1: dendrogram
|
||||
|
||||
Была сформулирована следующая задача: необходимо разбить записи на кластеры в зависимости от цен и площади.
|
||||
|
||||
### Запуск программы
|
||||
Файл lab4.py содержит и запускает программу, аргументов и настройки ~~вроде~~ не требует.
|
||||
|
||||
### Описание программы
|
||||
Программа считывает цены и площади из файла статистики сбербанка по рынку недвижимости.
|
||||
Поскольку по заданию требуется оценить машинную кластеризацию, для сравнения программа подсчитывает и выводит в консоль количество записей в каждом из выделенных вручную классов цен.
|
||||
Далее программа кластеризует данные с помощью алгоритма ближайших точек (на другие памяти нету) и выводит дендрограмму на основе кластеризации.
|
||||
Выводимая дендрограмма ограничена 15 последними (верхними) объединениями.
|
||||
|
||||
### Результаты тестирования
|
||||
По результатам тестирования, можно сказать следующее:
|
||||
* Последние объединения в дендрограмме - объединения выбросов с 'основным' кластером, то есть 10-20 записей с кластером с более чем 28000 записями.
|
||||
* Это правильная информация, так как ручная классификация показывает, что премиальных (аномально больших) цен как раз порядка 20, остальные относятся к другим классам.
|
||||
* Поскольку в имеющихся данных нет ограничений по ценам, выбросы аномально высоких цен при использовании данного алгоритма формируют отдельные кластеры, что негативно сказывается на наглядности.
|
||||
* Ценовое ограничение также не дало положительнх результатов: снова сформировался 'основной' кластер, с которым последними объединялись отдельные значения.
|
||||
* Значит, сам алгоритм не эффективен.
|
||||
|
||||
Итого: Алгоритм ближайших точек слишком чувствителен к выбросам, поэтому можно признать его неэффективным для необработанных данных. Дендрограмма как средство визуализации скорее уступает по наглядности диаграмме рассеяния.
|
||||
28896
alexandrov_dmitrii_lab_4/sberbank_data.csv
Normal file
115
antonov_dmitry_lab_7/README.md
Normal file
@@ -0,0 +1,115 @@
|
||||
# Лаб 7 RNN
|
||||
|
||||
Выбрать художественный текст (четные варианты – русскоязычный,
|
||||
нечетные – англоязычный) и обучить на нем рекуррентную нейронную сеть
|
||||
для решения задачи генерации. Подобрать архитектуру и параметры так,
|
||||
чтобы приблизиться к максимально осмысленному результату. Далее
|
||||
разбиться на пары четный-нечетный вариант, обменяться разработанными
|
||||
сетями и проверить, как архитектура товарища справляется с вашим текстом.
|
||||
В завершении подобрать компромиссную архитектуру, справляющуюся
|
||||
достаточно хорошо с обоими видами текстов.
|
||||
|
||||
# Вариант 3
|
||||
|
||||
Рекуррентная нейронная сеть и задача
|
||||
генерации текста
|
||||
|
||||
# Запуск
|
||||
|
||||
Выполнением скрипта файла (вывод в консоль).
|
||||
|
||||
# Описание модели:
|
||||
|
||||
Использованы библиотеки:
|
||||
* numpy (np): популярная библиотека для научных вычислений.
|
||||
* tensorflow (tf): библиотека для тренировки нейросетей.
|
||||
* Sequential: тип Keras модель которая позволяет создавать нейросети слой за слоем.
|
||||
* Embedding, LSTM, Dense: различные типы слоев в нейросетях.
|
||||
* Tokenizer: класс для конвертации слов в числовой понятный для нейросети формат.
|
||||
<p></p>
|
||||
Каждая строка текста переводится в числа с помощью Tokernizer.
|
||||
Класс Tokenizer в Keras - это утилита обработки текста, которая преобразует текст в
|
||||
последовательность целых чисел. Он присваивает уникальное целое число (индекс) каждому слову
|
||||
в тексте и создает словарь, который сопоставляет каждое слово с соответствующим индексом.
|
||||
Это позволяет вам работать с текстовыми данными в формате, который может быть передан в нейронную сеть.
|
||||
Все это записывается в input_sequences.
|
||||
|
||||
Строим RNN модель используя Keras:
|
||||
|
||||
* Embedding: Этот слой превращает числа в векторы плотности фиксированного размера. Так же известного
|
||||
как "word embeddings". Вложения слов - это плотные векторные представления слов в непрерывном
|
||||
векторном пространстве.Они позволяют нейронной сети изучать и понимать взаимосвязи между словами
|
||||
на основе их контекста в содержании текста.
|
||||
* LSTM: это тип рекуррентной нейронной сети (RNN), которая предназначена для обработки
|
||||
зависимостей в последовательностях.
|
||||
* Dense: полносвязный слой с множеством нейронов, нейронов столько же сколько и уникальных слов.
|
||||
Он выводит вероятность следующего слова.
|
||||
|
||||
* Модель обучаем на разном количестве эпох, по умолчанию epochs = 100 (итераций по всему набору данных).
|
||||
|
||||
Определеяем функцию generate_text которая принимает стартовое слово, а также, число слов для генерации.
|
||||
Модель генерирует текст путем многократного предсказания следующего слова на основе предыдущих слов в
|
||||
начальном тексте.
|
||||
|
||||
* В конце мы получаем сгенерированную на основе текста последовательность.
|
||||
|
||||
# Задача генерации англоязычного текста
|
||||
На вход подаем историю с похожими повторяющимися слова. Историю сохраняем в файл.
|
||||
Задача проверить насколько сеть не станет повторять текст, а будет действительно генерировать
|
||||
относительно новый текст.
|
||||
|
||||
# Результаты
|
||||
Тестируется английский текст, приложенный в репозитории.
|
||||
* на 50 эпохах ответ на I want
|
||||
* I want to soar high up in the sky like to glide through the clouds feeling the wind beneath my wings i want to fly i want to fly i want to fly i want to fly i want to fly i want to fly i want to fly i want to
|
||||
* на 100 эпох ответ на I want
|
||||
* I want to fly i want to soar high up in the sky like a bird to glide through the clouds feeling the wind beneath my wings i want to fly i want to fly i want to spread my wings and soar into the open sky to glide far above the
|
||||
* на 150 эпохах ответ на I want
|
||||
* I want to fly i want to spread my wings and soar into the open sky to glide far above the earth unbounded by gravity i want to fly i want to fly i want to fly i want to soar high up in the sky like a bird to glide through
|
||||
* на 220 эпохах ответ на I want
|
||||
* I want to fly i want to soar high up in the sky like a bird to glide through the clouds feeling the wind beneath my wings i want to fly i want to fly i want to fly i want to fly i want to fly i want to fly i
|
||||
|
||||
* На 220 эпохах результаты хуже, это произошло скорее всего из-за переобучения(грубый повтор).
|
||||
* На 50 эпохах нейронная сеть плохо обучена (из 1 места плюс повтор)
|
||||
* На 100 эпохах средний результат (из 2 мест)
|
||||
* На 150 эпохах нейронная сеть показывает наилучший результат (из 3 разных мест без повтора)
|
||||
|
||||
Так же модель работает и на русском тексте. Вот что сгенерировала модель на 150 эпохах.
|
||||
Предложения взяты из разных мест и выглядят осмысленно.
|
||||
"Я хочу летать потому что в этом заложено желание преодолевать границы хочу чувствовать себя
|
||||
свободным словно ветер несущим меня к новым приключениям я хочу летать и продолжать этот бескрайний
|
||||
полет вперед ибо в этом полете заключена вся суть моего существования существования существования
|
||||
существования существования трудности трудности трудности неважными хочу летать потому что."
|
||||
|
||||
Чем больше текст мы берем, тем более интересные результаты получаем, но моих вычислительных мощностей уже не хватит.
|
||||
Так же чем больше прогонов, тем лучше модель, но тоже не до бесконечности можно получить хороший результат.
|
||||
<p>
|
||||
<div>Обучение</div>
|
||||
<img src="screens/img_2.png" width="650" title="Обучение">
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div>Результат</div>
|
||||
<img src="screens/img_3.png" width="650" title="Результат">
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<div>Обучение 1</div>
|
||||
<img src="screens/step1.png" width="650" title="Обучение 1">
|
||||
</p>
|
||||
<p>
|
||||
<div>Обучение 2</div>
|
||||
<img src="screens/step2.png" width="650" title="Обучение 2">
|
||||
</p>
|
||||
<p>
|
||||
<div>Обучение 3</div>
|
||||
<img src="screens/step3.png" width="650" title="Обучение 3">
|
||||
</p>
|
||||
<p>
|
||||
<div>Обучение 4</div>
|
||||
<img src="screens/step4.png" width="650" title="Обучение 4">
|
||||
</p>
|
||||
<p>
|
||||
<div>Обучение 5</div>
|
||||
<img src="screens/step5.png" width="650" title="Обучение 5">
|
||||
</p>
|
||||
55
antonov_dmitry_lab_7/lab7.py
Normal file
@@ -0,0 +1,55 @@
|
||||
import numpy as np
|
||||
from keras.models import Sequential
|
||||
from keras.layers import Embedding, LSTM, Dense
|
||||
from keras.preprocessing.text import Tokenizer
|
||||
from keras_preprocessing.sequence import pad_sequences
|
||||
|
||||
# загрузка текста
|
||||
with open('rus.txt', encoding='utf-8') as file:
|
||||
text = file.read()
|
||||
|
||||
tokenizer = Tokenizer()
|
||||
tokenizer.fit_on_texts([text])
|
||||
total_words = len(tokenizer.word_index) + 1
|
||||
|
||||
input_sequences = []
|
||||
for line in text.split('\n'):
|
||||
token_list = tokenizer.texts_to_sequences([line])[0]
|
||||
for i in range(1, len(token_list)):
|
||||
n_gram_sequence = token_list[:i + 1]
|
||||
input_sequences.append(n_gram_sequence)
|
||||
|
||||
max_sequence_length = max([len(x) for x in input_sequences])
|
||||
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre')
|
||||
|
||||
predictors, labels = input_sequences[:, :-1], input_sequences[:, -1]
|
||||
|
||||
# создание RNN модели
|
||||
model = Sequential()
|
||||
model.add(Embedding(total_words, 100, input_length=max_sequence_length - 1))
|
||||
model.add(LSTM(150))
|
||||
model.add(Dense(total_words, activation='softmax'))
|
||||
|
||||
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
|
||||
|
||||
# тренировка модели
|
||||
model.fit(predictors, labels, epochs=150, verbose=1)
|
||||
|
||||
|
||||
# генерация текста на основе модели
|
||||
def generate_text(seed_text, next_words, model, max_sequence_length):
|
||||
for _ in range(next_words):
|
||||
token_list = tokenizer.texts_to_sequences([seed_text])[0]
|
||||
token_list = pad_sequences([token_list], maxlen=max_sequence_length - 1, padding='pre')
|
||||
predicted = np.argmax(model.predict(token_list), axis=-1)
|
||||
output_word = ""
|
||||
for word, index in tokenizer.word_index.items():
|
||||
if index == predicted:
|
||||
output_word = word
|
||||
break
|
||||
seed_text += " " + output_word
|
||||
return seed_text
|
||||
|
||||
|
||||
generated_text = generate_text("Я хочу", 50, model, max_sequence_length)
|
||||
print(generated_text)
|
||||
BIN
antonov_dmitry_lab_7/my_model.h5
Normal file
11
antonov_dmitry_lab_7/rus.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Я хочу летать. Почувствовать ветер в лицо, свободно парить в небесах. Я хочу летать, словно птица, освободившись от земных оков. Летать, словно орел, покоряя небесные просторы. Я хочу летать, чувствовать каждый момент поднятия в воздух, каждый поворот, каждое крыло, взмахнувшее в танце с аэродинамикой.
|
||||
|
||||
Я хочу летать над горами, смотреть на вершины, которые кажутся такими далекими с земли. Хочу летать над океанами, наблюдая за волнами, встречая закаты, окрашивающие водную гладь в огонь. Я хочу летать над городами, где жизнь бурлит своим ритмом, а улицы выглядят как мозаика, расстилающаяся под ногами.
|
||||
|
||||
Я хочу летать, ощущать тот подъем, когда ты понимаешь, что земля осталась позади, а ты – свободен, как никогда. Я хочу летать и видеть этот мир с высоты, где все проблемы кажутся такими маленькими и неважными. Хочу летать и чувствовать себя частью этого огромного космического танца, где звезды танцуют свои вечерние вальсы.
|
||||
|
||||
Я хочу летать, несмотря ни на что, преодолевая любые преграды. Хочу летать, потому что в этом чувствую свое настоящее "я". Летать – значит освобождаться от гравитации рутины, подниматься над повседневностью, смотреть на мир с высоты своей мечты.
|
||||
|
||||
Я хочу летать, потому что в этом заключена свобода души. Хочу ощутить, как воздух обволакивает меня, как каждая клетка моего тела ощущает эту свободу. Хочу летать, потому что это моя мечта, которая дает мне силы двигаться вперед, преодолевая все трудности.
|
||||
|
||||
Я хочу летать, потому что в этом заложено желание преодолевать границы. Хочу чувствовать себя свободным, словно ветер, несущим меня к новым приключениям. Я хочу летать и продолжать этот бескрайний полет вперед, ибо в этом полете заключена вся суть моего существования.
|
||||
BIN
antonov_dmitry_lab_7/screens/img.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
antonov_dmitry_lab_7/screens/img_1.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
antonov_dmitry_lab_7/screens/img_2.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
antonov_dmitry_lab_7/screens/img_3.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
antonov_dmitry_lab_7/screens/img_4.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
antonov_dmitry_lab_7/screens/step1.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
antonov_dmitry_lab_7/screens/step2.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
antonov_dmitry_lab_7/screens/step3.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
antonov_dmitry_lab_7/screens/step4.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
antonov_dmitry_lab_7/screens/step5.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
16
antonov_dmitry_lab_7/small.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
I want to fly. I want to soar high up in the sky like a bird. To glide through the clouds, feeling the wind beneath my wings. I want to fly.
|
||||
|
||||
I imagine what it would be like, to be able to spread my arms and take off into the endless blue. To swoop and dive and twirl through the air unencumbered by gravity's pull. I want to fly.
|
||||
|
||||
I watch the birds outside my window, floating effortlessly on the breeze. How I wish I could join them up there. To break free of the bounds of this earth and taste the freedom of flight. I want to fly.
|
||||
|
||||
Over and over I dream of flying. I flap my arms but remain stuck to the ground. Still I gaze up hopefully at the sky. One day, I tell myself. One day I will fly. I want to fly.
|
||||
I want to fly. I want to spread my wings and soar into the open sky. To glide far above the earth unbounded by gravity. I want to fly.
|
||||
|
||||
Ever since I was a child I've dreamed of flying. I would flap my arms trying in vain to take off. I envied the birds and their gift of flight. On windy days, I'd run with the breeze, hoping it would lift me up. But my feet stayed planted. Still my desire to fly remained.
|
||||
|
||||
As I grew up, my dreams of flying never left. I'd gaze out plane windows high above the earth and ache to sprout wings. I'd watch birds for hours wishing I could join their effortless flight. At night I'd have vivid dreams of gliding among the clouds. Then I'd awake still earthbound and sigh. My longing to fly unchanged.
|
||||
|
||||
I want to know what it feels like to swoop and dive through the air. To loop and twirl on the wind currents with ease. To soar untethered by gravity's grip. But I'm trapped on the ground, wings useless and weighted. Still I stare upwards hoping. Still I imagine what could be. Still I want to fly.
|
||||
|
||||
They say it's impossible, that humans aren't meant for flight. But I refuse to let go of this dream. I gaze up, envying the way the birds own the sky while my feet stay planted. I flap and I hope. And still I want to fly.
|
||||
109
arutunyan_dmitry_lab_2/README.md
Normal file
@@ -0,0 +1,109 @@
|
||||
|
||||
## Лабораторная работа 2. Вариант 4.
|
||||
### Задание
|
||||
Выполнить ранжирование признаков. Отобразить получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку. Провести анализ получившихся результатов. Какие четыре признака оказались самыми важными по среднему значению?
|
||||
|
||||
Модели:
|
||||
|
||||
- Гребневая регрессия `Ridge`,
|
||||
- Случайное Лассо `RandomizedLasso`,
|
||||
- Рекурсивное сокращение признаков `Recursive Feature Elimination – RFE`
|
||||
|
||||
> **Warning**
|
||||
>
|
||||
> Модель "случайное лассо" `RandomizedLasso` была признана устаревшей в бибилотеке `scikit` версии 0.20. Её безболезненной заменой назван регрессор случайного леса `RandomForestRegressor`. Он будет использоваться в данной лабораторной вместо устаревшей функции.
|
||||
|
||||
### Как запустить
|
||||
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||
```
|
||||
python main.py
|
||||
```
|
||||
|
||||
### Используемые технологии
|
||||
- Библиотека `numpy`, используемая для обработки массивов данных и вычислений
|
||||
- Библиотека `sklearn` - большой набор функционала для анализа данных. Из неё были использованы инструменты:
|
||||
- `LinearRegression` - инструмент работы с моделью "Линейная регрессия"
|
||||
- `Ridge` - инструмент работы с моделью "Гребневая регрессия"
|
||||
- `RFE` - инструмент оценки важности признаков "Рекурсивное сокращение признаков"
|
||||
- `RandomForestRegressor` - инструмент работы с моделью "Регрессор случайного леса"
|
||||
- `MinMaxScaler` - инструмент масштабирования значений в заданный диапазон
|
||||
|
||||
### Описание работы
|
||||
Программа генерирует данные для обучения моделей. Сначала генерируются признаки в количестве 14-ти штук, важность которых модели предстоит выявить.
|
||||
```python
|
||||
np.random.seed(0)
|
||||
size = 750
|
||||
X = np.random.uniform(0, 1, (size, 14))
|
||||
```
|
||||
Затем задаётся функция зависимости выходных параметров от входных, представляющая собой регриссионную проблему Фридмана.
|
||||
```python
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
|
||||
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1))
|
||||
```
|
||||
После чего, задаются зависимости переменных `x11 x12 x13 x14` от переменных `x1 x2 x3 x4`.
|
||||
```python
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
|
||||
```
|
||||
Первая группа переменных должна быть обозначена моделями как наименее значимая.
|
||||
|
||||
#### Работа с моделями
|
||||
Первая модель `Ridge` - модель гребневой регрессии.
|
||||
```python
|
||||
ridge = Ridge(alpha=1)
|
||||
ridge.fit(X, Y)
|
||||
```
|
||||
Данная модель не предоставляет прямого способа оценки важности признаков, так как она использует линейную комбинацию всех признаков с коэффициентами, которые оптимизируются во время обучения модели. Можно лишь оценить относительную важность признаков на основе абсолютных значений коэффициентов, которые были найдены в процессе обучения. Получить данные коэфициенты от модели можно с помощью метода `.coef_`.
|
||||
|
||||
Вторая модель `RandomForestRegressor` - алгоритм ансамбля случайных деревьев решений. Он строит множество деревьев, каждое из которых обучается на случайной подвыборке данных и случайном подмножестве признаков.
|
||||
```python
|
||||
rfr = RandomForestRegressor()
|
||||
rfr.fit(X, Y)
|
||||
```
|
||||
Важность признаков в Random Forest Regressor определяется на основе того, как сильно каждый признак влияет на уменьшение неопределенности в предсказаниях модели. Для получения оценок важности в данной модели используется функция `.feature_importances_`.
|
||||
|
||||
Третий инструмент `Recursive Feature Elimination – RFE` - алгоритм отбора признаков, который используется для оценки и ранжирования признаков по их важности.
|
||||
```python
|
||||
lr = LinearRegression()
|
||||
lr.fit(X, Y)
|
||||
rfe = RFE(lr)
|
||||
rfe.fit(X,Y)
|
||||
```
|
||||
Оценка важности признаков в RFE происходит путем анализа, как изменяется производительность модели при удалении каждого признака. В зависимости от этого, каждый признак получает ранг. Массив рангов признаков извлекается функцией `.ranking_`
|
||||
|
||||
#### Нормализация оценок
|
||||
Модели `Ridge` и `RandomForestRegressor` рабботают по одинаковой логике вывода значимости оценок. В данных моделях оценки значимости параметров - веса значимости, которые они представляют для модели. Очевидно, что чем выше данный показатеь, тем более значимым является признак. Для нормализации оценок необходимо взять их по модулю и привести их к диапазону от 0 до 1.
|
||||
```python
|
||||
ranks = np.abs(ranks)
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
```
|
||||
Инструмент `Recursive Feature Elimination – RFE` работает иначе. Класс выдает не веса при коэффициентах регрессии, а именно ранг для каждого признака. Так наиболее важные признаки будут иметь ранг – "1", а менее важные признаки ранг больше "1". Коэффициенты остальных моделей тем важнее, чем больше их абсолютное значение. Для нормализации таких рангов от 0 до 1, необходимо просто взять обратное число от величины ранга признака.
|
||||
```python
|
||||
new_ranks = [float(1 / x) for x in ranks]
|
||||
new_ranks = map(lambda x: round(x, 2), new_ranks)
|
||||
```
|
||||
|
||||
#### Оценка работы моделей
|
||||
Для оценки результатов выведем выявленные оценки значимости признаков каждой модели, а также средние оценки значимости признаков всех моделей.
|
||||
```
|
||||
Ridge
|
||||
[('x4', 1.0), ('x1', 0.98), ('x2', 0.8), ('x14', 0.61), ('x5', 0.54), ('x12', 0.39), ('x3', 0.25), ('x13', 0.19), ('x11', 0.16), ('x6', 0.08), ('x8', 0.07), ('x7', 0.02), ('x10', 0.02), ('x9', 0.0)]
|
||||
Recursive Feature Elimination
|
||||
[('x1', 1.0), ('x2', 1.0), ('x3', 1.0), ('x4', 1.0), ('x5', 1.0), ('x11', 1.0), ('x13', 1.0), ('x12', 0.5), ('x14', 0.33), ('x8', 0.25), ('x6', 0.2), ('x10', 0.17), ('x7', 0.14), ('x9', 0.12)]
|
||||
Random Forest Regression
|
||||
[('x14', 1.0), ('x2', 0.84), ('x4', 0.77), ('x1', 0.74), ('x11', 0.36), ('x12', 0.35), ('x5', 0.28), ('x3', 0.12), ('x13', 0.12), ('x6', 0.01), ('x7', 0.01), ('x8', 0.01), ('x9', 0.01), ('x10', 0.0)]
|
||||
Mean
|
||||
[('x4', 0.92), ('x1', 0.91), ('x2', 0.88), ('x14', 0.65), ('x5', 0.61), ('x11', 0.51), ('x3', 0.46), ('x13', 0.44), ('x12', 0.41), ('x8', 0.11), ('x6', 0.1), ('x7', 0.06), ('x10', 0.06), ('x9', 0.04)]
|
||||
|
||||
```
|
||||
- Модель `Ridge` верно выявила значимость признаков `x1, x2, x4, х5`, но потеряла значимый признак `x3` и ошибочно включила признак `x14` в значимые.
|
||||
- Модель `RandomForestRegressor` также верно выявила значимость признаков `x1, x2, x4`, но потеряла значимые признаки `x3, х5` и ошибочно включила признак `x14` в значимые.
|
||||
- Инсрумент `Recursive Feature Elimination – RFE` безошибочно выделил все значимые признаки `x1, x2, х3, x4, x5`, но ошибочно отметил признаки `x11, x13` как значимые.
|
||||
- В среднем значимыми признаками были верно выявлены `x1, x2, x4, х5`, но значимый признак `x3` был потерян, а признаки `x11, х14` были признаны ошибочно значимыми.
|
||||
|
||||
|
||||
### Вывод
|
||||
Хужё всех показала себя модель `RandomForestRegressor`, потеряв два значимых признака и добавив один лишний. Модель `Ridge`и инструмент `Recursive Feature Elimination – RFE` допустили по одной ошибке, однако последний не потерял ни одного значимого признака. Значимость в среднем получилась неудовлетворительна и выдала три ошибки, как и первая модель.
|
||||
|
||||
Исходя из этого, можно сделать вывод, что для ранжирования признаков лучше использовать специально созданные для этого инструменты по типу `Recursive Feature Elimination – RFE`, а не использовать коэфициенты признаков регрессионных моделей.
|
||||
69
arutunyan_dmitry_lab_2/main.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from operator import itemgetter
|
||||
import numpy as np
|
||||
from sklearn.ensemble import RandomForestRegressor
|
||||
from sklearn.feature_selection import RFE
|
||||
from sklearn.linear_model import LinearRegression, Ridge
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
|
||||
|
||||
np.random.seed(0)
|
||||
size = 750
|
||||
X = np.random.uniform(0, 1, (size, 14)) # Генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков
|
||||
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
|
||||
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1)) # Задаем функцию-выход: регрессионную проблему Фридмана
|
||||
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4)) # Добавляем зависимость признаков
|
||||
|
||||
ridge = Ridge(alpha=1) # Создаём модель гребневой регрессии и обучаем её
|
||||
ridge.fit(X, Y)
|
||||
|
||||
lr = LinearRegression() # Создаём модель линейной регрессии и обучаем её
|
||||
lr.fit(X, Y)
|
||||
rfe = RFE(lr) # На основе линейной модели выполняем рекурсивное сокращение признаков
|
||||
rfe.fit(X,Y)
|
||||
|
||||
rfr = RandomForestRegressor() # Создаём и обучаем регрессор случайного леса (используется вместо устаревшего рандомизированного лассо)
|
||||
rfr.fit(X, Y)
|
||||
|
||||
|
||||
def rank_ridge_rfr_to_dict(ranks, names): # Метод нормализации оценок важности для модели гребневой регрессии и регрессора случайного леса
|
||||
ranks = np.abs(ranks)
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
return dict(zip(names, ranks))
|
||||
|
||||
|
||||
def rank_rfe_to_dict(ranks, names): # Метод нормализации оценок важности для модели рекурсивного сокращения признаков
|
||||
new_ranks = [float(1 / x) for x in ranks]
|
||||
new_ranks = map(lambda x: round(x, 2), new_ranks)
|
||||
return dict(zip(names, new_ranks))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
names = ["x%s" % i for i in range(1, 15)]
|
||||
ranks = dict()
|
||||
|
||||
ranks["Ridge"] = rank_ridge_rfr_to_dict(ridge.coef_, names)
|
||||
ranks["Recursive Feature Elimination"] = rank_rfe_to_dict(rfe.ranking_, names)
|
||||
ranks["Random Forest Regression"] = rank_ridge_rfr_to_dict(rfr.feature_importances_, names)
|
||||
|
||||
for key, value in ranks.items(): # Вывод нормализованных оценок важности признаков каждой модели
|
||||
ranks[key] = sorted(value.items(), key=itemgetter(1), reverse=True)
|
||||
for key, value in ranks.items():
|
||||
print(key)
|
||||
print(value)
|
||||
|
||||
mean = {} # Нахождение средних значений оценок важности по 3м моделям
|
||||
for key, value in ranks.items():
|
||||
for item in value:
|
||||
if item[0] not in mean:
|
||||
mean[item[0]] = 0
|
||||
mean[item[0]] += item[1]
|
||||
for key, value in mean.items():
|
||||
res = value / len(ranks)
|
||||
mean[key] = round(res, 2)
|
||||
mean = sorted(mean.items(), key=itemgetter(1), reverse=True)
|
||||
print("Mean")
|
||||
print(mean)
|
||||
BIN
arutunyan_dmitry_lab_3/FullParam.png
Normal file
|
After Width: | Height: | Size: 154 KiB |
BIN
arutunyan_dmitry_lab_3/ImpParam.png
Normal file
|
After Width: | Height: | Size: 178 KiB |
170
arutunyan_dmitry_lab_3/README.md
Normal file
@@ -0,0 +1,170 @@
|
||||
|
||||
## Лабораторная работа 3. Вариант 4.
|
||||
### Задание
|
||||
Выполнить ранжирование признаков и решить с помощью библиотечной реализации дерева решений
|
||||
задачу классификации на 99% данных из курсовой работы. Проверить
|
||||
работу модели на оставшемся проценте, сделать вывод.
|
||||
|
||||
Модель:
|
||||
|
||||
- Дерево решений `DecisionTreeClassifier`.
|
||||
|
||||
### Как запустить
|
||||
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||
```
|
||||
python main.py
|
||||
```
|
||||
После этого в папке `static` сгенерируются 2 графика, по которым оценивается результат выполнения программы.
|
||||
|
||||
### Используемые технологии
|
||||
- Библиотека `numpy`, используемая для обработки массивов данных и вычислений
|
||||
- Библиотека `pyplot`, используемая для построения графиков.
|
||||
- Библиотека `pandas`, используемая для работы с данными для анализа scv формата.
|
||||
- Библиотека `sklearn` - большой набор функционала для анализа данных. Из неё были использованы инструменты:
|
||||
- `DecisionTreeClassifier` - инструмент работы с моделью "Дерево решений"
|
||||
- `metrics` - набор инструменов для оценки моделей
|
||||
- `MinMaxScaler` - инструмент масштабирования значений в заданный диапазон
|
||||
|
||||
### Описание работы
|
||||
#### Описание набора данных
|
||||
Набор данных - набор для определения возможности наличия ССЗ заболеваний у челоека
|
||||
|
||||
Названия столбцов набора данных и их описание:
|
||||
|
||||
* HeartDisease - Имеет ли человек ССЗ (No / Yes),
|
||||
* BMI - Индекс массы тела человека (float),
|
||||
* Smoking - Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (No / Yes),
|
||||
* AlcoholDrinking - Сильно ли человек употребляет алкоголь (No / Yes),
|
||||
* Stroke - Был ли у человека инсульт (No / Yes),
|
||||
* PhysicalHealth - Сколько дней за последний месяц человек чувствовал себя плохо (0-30),
|
||||
* MentalHealth - Сколько дней за последний месяц человек чувствовал себя удручённо (0-30),
|
||||
* DiffWalking - Ииспытывает ли человек трудности при ходьбе (No / Yes),
|
||||
* Sex - Пол (female, male),
|
||||
* AgeCategory - Возрастная категория (18-24, 25-29, 30-34, 35-39, 40-44, 45-49, 50-54, 55-59, 60-64, 65-69, 70-74, 75-79, 80 or older),
|
||||
* Race - Национальная принадлежность человека (White, Black, Hispanic, American Indian/Alaskan Native, Asian, Other),
|
||||
* Diabetic - Был ли у человека диабет (No / Yes),
|
||||
* PhysicalActivity - Занимался ли человек спротом за последний месяц (No / Yes),
|
||||
* GenHealth - Общее самочувствие человека (Excellent, Very good, Good, Fair, Poor),
|
||||
* SleepTime - Сколько человек в среднем спит за 24 часа (0-24),
|
||||
* Asthma - Была ли у человека астма (No / Yes),
|
||||
* KidneyDisease - Было ли у человека заболевание почек (No / Yes),
|
||||
* SkinCancer - Был ли у человека рак кожи (No / Yes).
|
||||
|
||||
Ссылка на страницу набора на kuggle: [Indicators of Heart Disease](https://www.kaggle.com/datasets/kamilpytlak/personal-key-indicators-of-heart-disease/data)
|
||||
|
||||
#### Оцифровка и нормализация данных
|
||||
Для нормальной работы с данными, необходимо исключить из них все нечисловые значения. После этого, представить все строковые значения параметров как числовые и очистить датасет от "мусора". Для удаления нечисловых значений воспользуемся функцией `.dropna()`. Мы исключаем строки с нечисловыми значениями, поскольку данные предварительно были очищены (указано в описании датасета) и строк данных достаточно с избытком для обучение модели: `400.000`.
|
||||
|
||||
После этого, переведём все строковые значения данных в числовые методами прямой оцифровки, разделения на группы, ранжирования.
|
||||
|
||||
Процесс оцифровки данных столбцов со строковыми значениями:
|
||||
|
||||
- Имеет ли человек ССЗ (0 / 1)
|
||||
- Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (0 / 1)
|
||||
- Сильно ли человек употребляет алкоголь (0 / 1)
|
||||
- Был ли у человека инсульт (0 / 1)
|
||||
- Ииспытывает ли человек трудности при ходьбе (0 / 1)
|
||||
- Пол (Ж - 0 / М - 1)
|
||||
- Возрастная категория (средний возраст каждого диапазона)
|
||||
- Национальная принадлежность человека
|
||||
- White - Европиойды - 0
|
||||
- Black - Негройды - 1
|
||||
- Hispanic - Испанцы - 2
|
||||
- American Indian/Alaskan Native - Индусы - 3
|
||||
- Asian - Азиаты - 4
|
||||
- Other - Другие - 5
|
||||
- Был ли у человека диабет (0 / 1)
|
||||
- Занимался ли человек спротом за последний месяц (0 / 1)
|
||||
- Общее самочувствие человека
|
||||
- Excellent - Отлично - 4
|
||||
- Very good - Очень хорошо - 3
|
||||
- Good - Хорошо - 2
|
||||
- Fair - Нормально - 1
|
||||
- "Poor" / "Other..." - Плохое или другое - 0
|
||||
- Была ли у человека астма (0 / 1)
|
||||
- Было ли у человека заболевание почек (0 /1)
|
||||
- Был ли у человека рак кожи (0 / 1)
|
||||
|
||||
После оцифровки значений необходимо избавиться от строк с возможными остаточнымии данными ("мусором"). Для этого переведём автоматически все значения датасета в числовые функцией `to_numeric` и непереводимые отметим как `NaN` (параметр `errors='coerce'`). После снова сотрём строки содержащие нечисловые значения методом `.dropna()` и сохраним нормализованный датасет в новый csv файл:
|
||||
```python
|
||||
df = df.applymap(pd.to_numeric, errors='coerce').dropna()
|
||||
df.to_csv(fileout, index=False)
|
||||
```
|
||||
|
||||
#### Выявление значимых параметров
|
||||
В выбранном датасете параметром предсказания `y` выступает столбец данных `HeartDisease`. Остальные столбцы считаются параметрами для решения задачи предсказания `x`, которые необходимо проранжировать по важности. Чтобы разделить выборку данных на обучаемую и тестовую, воспользуемся функцией `.iloc`.
|
||||
```python
|
||||
x_train = df[["BMI", "Smoking", "AlcoholDrinking", "Stroke", "PhysicalHealth",
|
||||
"MentalHealth", "DiffWalking", "Sex", "AgeCategory", "Race", "Diabetic",
|
||||
"PhysicalActivity", "GenHealth", "SleepTime", "Asthma", "KidneyDisease", "SkinCancer"]].iloc[
|
||||
0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df[["BMI", "Smoking", "AlcoholDrinking", "Stroke", "PhysicalHealth",
|
||||
"MentalHealth", "DiffWalking", "Sex", "AgeCategory", "Race", "Diabetic",
|
||||
"PhysicalActivity", "GenHealth", "SleepTime", "Asthma", "KidneyDisease", "SkinCancer"]].iloc[
|
||||
round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
```
|
||||
Где `round(len(df) / 100 * 99)` - 99ти процентная строка в датасете.
|
||||
|
||||
Теперь, обучим модель на данных `x_train` и `y_train` и получим значимость каждого признака в модели с помощью метода `.feature_importances_`. После отмасштабируем значения важности признаков.
|
||||
```python
|
||||
ranks = np.abs(dtc.feature_importances_)
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(len(x_train.columns), 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
ranks = dict(zip(x_train.columns, ranks))
|
||||
ranks = dict(sorted(ranks.items(), key=lambda x: x[1], reverse=True))
|
||||
```
|
||||
|
||||
Чтобы отсеять значимые параметры от незначимых, условимся, что параметры, с оценкой значимости меньше `0.05` будут считаться незначимыми. Выведем список параметров с пометками:
|
||||
```
|
||||
X ranging results:
|
||||
* BMI: 1.0 - Approved
|
||||
* SleepTime: 0.26 - Approved
|
||||
* PhysicalHealth: 0.18 - Approved
|
||||
* GenHealth: 0.16 - Approved
|
||||
* MentalHealth: 0.15 - Approved
|
||||
* AgeCategory: 0.14 - Approved
|
||||
* Race: 0.07 - Approved
|
||||
* PhysicalActivity: 0.06 - Approved
|
||||
* Stroke: 0.04 - Eliminated
|
||||
* Smoking: 0.03 - Eliminated
|
||||
* Asthma: 0.03 - Eliminated
|
||||
* SkinCancer: 0.03 - Eliminated
|
||||
* DiffWalking: 0.02 - Eliminated
|
||||
* Sex: 0.02 - Eliminated
|
||||
* AlcoholDrinking: 0.0 - Eliminated
|
||||
* Diabetic: 0.0 - Eliminated
|
||||
* KidneyDisease: 0.0 - Eliminated
|
||||
```
|
||||
|
||||
Где `Approved` - параметр значим и будет использоваться в предсказании, а `Eliminated` - параметр незначим и будет исключён.
|
||||
|
||||
#### Решение задачи кластеризации на полном наборе признаков
|
||||
Чтобы решить задачу кластеризации моделью `DecisionTreeClassifier`, воспользуемся методом `.predict()`. Оценку качества решения и графики будем строить теми же методами, что в 1й лабораторной работе.
|
||||
|
||||
График решения задачи классификации на полном наборе признаков:
|
||||
|
||||

|
||||
|
||||
#### Решение задачи кластеризации, используя только значимые признаки
|
||||
Согласно предыдущему пункту, значимыми признаками модели были выявлены:
|
||||
* BMI
|
||||
* SleepTime
|
||||
* PhysicalHealth
|
||||
* GenHealth
|
||||
* MentalHealth
|
||||
* AgeCategory
|
||||
* Race
|
||||
* PhysicalActivity
|
||||
Обучим модель только с их использованием, решим задачу классификации и построим график.
|
||||
|
||||
График решения задачи классификации, используя только значимые признаки:
|
||||
|
||||

|
||||
|
||||
### Вывод
|
||||
Согласно среднеквадратической ошибке и коэфициенту детерминации, модель, обученная только на значимых признаков отработала точнее, чем модель, обученная на полном наборе признаков. Это значит, что ранжирование было проведено верно и дало полезный результат. О логической оценке исключённых данных сказать ничего не получится, поскольку действительную зависимость результата от параметров значет только медицинский эксперт.
|
||||
|
||||
Исходя их общих значений точности, обе модели показали хорошие результаты и могут быть применимы к решению задачи классификации на данном наборе данных.
|
||||
221
arutunyan_dmitry_lab_3/main.py
Normal file
@@ -0,0 +1,221 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from sklearn import metrics
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
from sklearn.tree import DecisionTreeClassifier
|
||||
|
||||
'''
|
||||
Названия столбцов набора данных и их описание:
|
||||
|
||||
* HeartDisease - Имеет ли человек ССЗ (No / Yes),
|
||||
* BMI - Индекс массы тела человека (float),
|
||||
* Smoking - Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (No / Yes),
|
||||
* AlcoholDrinking - Сильно ли человек употребляет алкоголь (No / Yes),
|
||||
* Stroke - Был ли у человека инсульт (No / Yes),
|
||||
* PhysicalHealth - Сколько дней за последний месяц человек чувствовал себя плохо (0-30),
|
||||
* MentalHealth - Сколько дней за последний месяц человек чувствовал себя удручённо (0-30),
|
||||
* DiffWalking - Ииспытывает ли человек трудности при ходьбе (No / Yes),
|
||||
* Sex - Пол (female, male),
|
||||
* AgeCategory - Возрастная категория (18-24, 25-29, 30-34, 35-39, 40-44, 45-49, 50-54, 55-59, 60-64, 65-69, 70-74, 75-79, 80 or older),
|
||||
* Race - Национальная принадлежность человека (White, Black, Hispanic, American Indian/Alaskan Native, Asian, Other),
|
||||
* Diabetic - Был ли у человека диабет (No / Yes),
|
||||
* PhysicalActivity - Занимался ли человек спротом за последний месяц (No / Yes),
|
||||
* GenHealth - Общее самочувствие человека (Excellent, Very good, Good, Fair, Poor),
|
||||
* SleepTime - Сколько человек в среднем спит за 24 часа (0-24),
|
||||
* Asthma - Была ли у человека астма (No / Yes),
|
||||
* KidneyDisease - Было ли у человека заболевание почек (No / Yes),
|
||||
* SkinCancer - Был ли у человека рак кожи (No / Yes).
|
||||
'''
|
||||
|
||||
|
||||
# Метод оцифровки и нормализации данных
|
||||
def normalisation(filename):
|
||||
fileout = "P:\\ULSTU\\ИИС\\Datasets\\heart_2020_norm.csv"
|
||||
df = pd.read_csv(filename, sep=',').dropna() # Считываем данные с csv файла и удаляем строки, содержащие NaN
|
||||
|
||||
for index, row in df.iterrows():
|
||||
if index % 10000 == 0:
|
||||
print("normalisation running . . . " + str(round((index / len(df) * 100), 2)) +'%')
|
||||
if "Yes" in row["HeartDisease"]: # Имеет ли человек ССЗ (0 / 1)
|
||||
df.at[index, "HeartDisease"] = 1
|
||||
else:
|
||||
df.at[index, "HeartDisease"] = 0
|
||||
if "Yes" in row["Smoking"]: # Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (0 / 1)
|
||||
df.at[index, "Smoking"] = 1
|
||||
else:
|
||||
df.at[index, "Smoking"] = 0
|
||||
if "Yes" in row["AlcoholDrinking"]: # Сильно ли человек употребляет алкоголь (0 / 1)
|
||||
df.at[index, "AlcoholDrinking"] = 1
|
||||
else:
|
||||
df.at[index, "AlcoholDrinking"] = 0
|
||||
if "Yes" in row["Stroke"]: # Был ли у человека инсульт (0 / 1)
|
||||
df.at[index, "Stroke"] = 1
|
||||
else:
|
||||
df.at[index, "Stroke"] = 0
|
||||
if "Yes" in row["DiffWalking"]: # Ииспытывает ли человек трудности при ходьбе (0 / 1)
|
||||
df.at[index, "DiffWalking"] = 1
|
||||
else:
|
||||
df.at[index, "DiffWalking"] = 0
|
||||
if "Female" in row["Sex"]: # Пол (Ж - 0 / М - 1)
|
||||
df.at[index, "Sex"] = 0
|
||||
else:
|
||||
df.at[index, "Sex"] = 1
|
||||
if "18-24" in row["AgeCategory"]: # Возрастная категория (средний возраст каждого диапазона)
|
||||
df.at[index, "AgeCategory"] = (18 + 24) / 2
|
||||
elif "25-29" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (25 + 29) / 2
|
||||
elif "30-34" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (30 + 34) / 2
|
||||
elif "35-39" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (35 + 39) / 2
|
||||
elif "40-44" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (40 + 44) / 2
|
||||
elif "45-49" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (45 + 49) / 2
|
||||
elif "50-54" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (50 + 54) / 2
|
||||
elif "55-59" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (55 + 59) / 2
|
||||
elif "60-64" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (60 + 64) / 2
|
||||
elif "65-69" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (65 + 69) / 2
|
||||
elif "70-74" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (70 + 74) / 2
|
||||
elif "75-79" in row["AgeCategory"]:
|
||||
df.at[index, "AgeCategory"] = (75 + 79) / 2
|
||||
else:
|
||||
df.at[index, "AgeCategory"] = (25 + 29) / 2
|
||||
if "White" in row["Race"]: # Национальная принадлежность человека
|
||||
df.at[index, "Race"] = 0 # White - Европиойды - 0
|
||||
elif "Black" in row["Race"]: # Black - Негройды - 1
|
||||
df.at[index, "Race"] = 1 # Hispanic - Испанцы - 2
|
||||
elif "Hispanic" in row["Race"]: # American Indian/Alaskan Native - Индусы - 3
|
||||
df.at[index, "Race"] = 2 # Asian - Азиаты - 4
|
||||
elif "American Indian/Alaskan Native" in row["Race"]: # Other - Другие - 5
|
||||
df.at[index, "Race"] = 3
|
||||
elif "Asian" in row["Race"]:
|
||||
df.at[index, "Race"] = 4
|
||||
else:
|
||||
df.at[index, "Race"] = 5
|
||||
if "Yes" in row["Diabetic"]: # Был ли у человека диабет (0 / 1)
|
||||
df.at[index, "Diabetic"] = 1
|
||||
else:
|
||||
df.at[index, "Diabetic"] = 0
|
||||
if "Yes" in row["PhysicalActivity"]: # Занимался ли человек спротом за последний месяц (0 / 1)
|
||||
df.at[index, "PhysicalActivity"] = 1
|
||||
else:
|
||||
df.at[index, "PhysicalActivity"] = 0
|
||||
if "Excellent" in row["GenHealth"]: # Общее самочувствие человека
|
||||
df.at[index, "GenHealth"] = 4 # Excellent - Отлично - 4
|
||||
elif "Very good" in row["GenHealth"]: # Very good - Очень хорошо - 3
|
||||
df.at[index, "GenHealth"] = 3 # Good - Хорошо - 2
|
||||
elif "Good" in row["GenHealth"]: # Fair - Нормально - 1
|
||||
df.at[index, "GenHealth"] = 2 # "Poor" / "Other..." - Плохое или другое - 0
|
||||
elif "Fair" in row["GenHealth"]:
|
||||
df.at[index, "GenHealth"] = 1
|
||||
else:
|
||||
df.at[index, "GenHealth"] = 0
|
||||
if "Yes" in row["Asthma"]: # Была ли у человека астма (0 / 1)
|
||||
df.at[index, "Asthma"] = 1
|
||||
else:
|
||||
df.at[index, "Asthma"] = 0
|
||||
if "Yes" in row["KidneyDisease"]: # Было ли у человека заболевание почек (0 /1)
|
||||
df.at[index, "KidneyDisease"] = 1
|
||||
else:
|
||||
df.at[index, "KidneyDisease"] = 0
|
||||
if "Yes" in row["SkinCancer"]: # Был ли у человека рак кожи (0 / 1)
|
||||
df.at[index, "SkinCancer"] = 1
|
||||
else:
|
||||
df.at[index, "SkinCancer"] = 0
|
||||
|
||||
df = df.applymap(pd.to_numeric, errors='coerce').dropna() # Гарантированно убираем все нечисловые значения из датасета
|
||||
df.to_csv(fileout, index=False) # Сохраняем нормализованный датасет для дальнейшей работы
|
||||
return fileout
|
||||
|
||||
|
||||
# Метод ранжирования параметров по степени важности
|
||||
def param_range(filename, elim_kp):
|
||||
df = pd.read_csv(filename, sep=',') # Считываем нормализованные данные и разделяем их на выборки
|
||||
x_train = df[["BMI", "Smoking", "AlcoholDrinking", "Stroke", "PhysicalHealth",
|
||||
"MentalHealth", "DiffWalking", "Sex", "AgeCategory", "Race", "Diabetic",
|
||||
"PhysicalActivity", "GenHealth", "SleepTime", "Asthma", "KidneyDisease", "SkinCancer"]].iloc[
|
||||
0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df[["BMI", "Smoking", "AlcoholDrinking", "Stroke", "PhysicalHealth",
|
||||
"MentalHealth", "DiffWalking", "Sex", "AgeCategory", "Race", "Diabetic",
|
||||
"PhysicalActivity", "GenHealth", "SleepTime", "Asthma", "KidneyDisease", "SkinCancer"]].iloc[
|
||||
round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
|
||||
dtc = DecisionTreeClassifier(random_state=241) # Создаём модель дерева решений
|
||||
dtc.fit(x_train.values, y_train.values) # Обучаем модель на данных
|
||||
y_predict = dtc.predict(x_test.values) # Решаем задачу классификации на полном наборе признаков
|
||||
err = pred_errors(y_predict, y_test.values) # Рассчитываем ошибки предсказания
|
||||
make_plots(y_test.values, y_predict, err[0], err[1], "Полный набор данных") # Строим графики
|
||||
|
||||
ranks = np.abs(dtc.feature_importances_) # Получаем значимость каждого признака в модели
|
||||
minmax = MinMaxScaler() # Шкалируем и нормализуем значимость
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(len(x_train.columns), 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
ranks = dict(zip(x_train.columns, ranks))
|
||||
ranks = dict(sorted(ranks.items(), key=lambda x: x[1], reverse=True)) # Сортируем оценки по максимуму и записываем в словарь
|
||||
|
||||
print("X ranging results: \n")
|
||||
del_keys = [] # Исключаем параметры, важность которых меньше elim_kp
|
||||
for key, value in ranks.items():
|
||||
if value >= elim_kp:
|
||||
print(" * " + key + ": " + str(value) + " - Approved")
|
||||
else:
|
||||
print(" * " + key + ": " + str(value) + " - Eliminated")
|
||||
del_keys.append(key)
|
||||
|
||||
for key in del_keys:
|
||||
ranks.pop(key)
|
||||
|
||||
return filename, ranks.keys()
|
||||
|
||||
|
||||
# Метод решения задачи классификации, основанный только на значимых параметрах
|
||||
def most_valuable_prediction(params):
|
||||
filename = params[0]
|
||||
val_p = params[1]
|
||||
df = pd.read_csv(filename, sep=',')
|
||||
x_train = df[val_p].iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df[val_p].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
|
||||
dtc = DecisionTreeClassifier(random_state=241)
|
||||
dtc.fit(x_train.values, y_train.values)
|
||||
y_predict = dtc.predict(x_test.values)
|
||||
err = pred_errors(y_predict, y_test.values)
|
||||
make_plots(y_test.values, y_predict, err[0], err[1], "Только важные параметры")
|
||||
|
||||
|
||||
# Метод рассчёта ошибок
|
||||
def pred_errors(y_predict, y_test):
|
||||
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3) # Рассчёт среднеквадратичной ошибки модели
|
||||
det_kp = np.round(metrics.accuracy_score (y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
|
||||
return mid_square, det_kp
|
||||
|
||||
|
||||
# Метод отрисовки графиков
|
||||
def make_plots(y_test, y_predict, mid_sqrt, det_kp, title):
|
||||
plt.plot(y_test, c="red", label="\"y\" исходная") # Создание графика исходной функции
|
||||
plt.plot(y_predict, c="green", label="\"y\" предсказанная \n"
|
||||
"Ср^2 = " + str(mid_sqrt) + "\n"
|
||||
"Кд = " + str(det_kp)) # Создание графика предсказанной функции
|
||||
plt.legend(loc='lower left')
|
||||
plt.title(title)
|
||||
plt.savefig('static/' + title + '.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Работа системы в комплексе
|
||||
# Здесь elim_kp - значение пороговой значимости параметра (выбран эмпирически)
|
||||
most_valuable_prediction(param_range(normalisation("P:\\ULSTU\\ИИС\\Datasets\\heart_2020_cleaned.csv"), 0.05))
|
||||
|
||||
|
||||
131
arutunyan_dmitry_lab_4/README.md
Normal file
@@ -0,0 +1,131 @@
|
||||
|
||||
## Лабораторная работа 4. Вариант 4.
|
||||
### Задание
|
||||
Использовать метод кластеризации по варианту для данных из курсовой работы. Самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для
|
||||
решения сформулированной задачи.
|
||||
|
||||
Алгоритм кластеризации:
|
||||
|
||||
- Пространственная кластеризация данных с шумом на основе плотности `DBSCAN`.
|
||||
|
||||
### Как запустить
|
||||
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||
```
|
||||
python main.py
|
||||
```
|
||||
После этого в папке `static` сгенерируются 3 графика, по которым оценивается результат выполнения программы.
|
||||
|
||||
### Используемые технологии
|
||||
- Библиотека `numpy`, используемая для обработки массивов данных и вычислений
|
||||
- Библиотека `pyplot`, используемая для построения графиков.
|
||||
- Библиотека `pandas`, используемая для работы с данными для анализа scv формата.
|
||||
- Библиотека `sklearn` - большой набор функционала для анализа данных. Из неё были использованы инструменты:
|
||||
- `DBSCAN` - инструмент работы с моделью "Пространственная кластеризация данных с шумом на основе плотности"
|
||||
- `metrics` - набор инструменов для оценки моделей
|
||||
- `LinearRegression` - инструмент работы с моделью "Линейная регрессия"
|
||||
|
||||
`DBSCAN` - это алгоритм кластеризации, который используется для кластеризации данных на основе плотности, что позволяет обнаруживать кластеры произвольной формы и обнаруживать выбросы (шум). `DBSCAN` может быть полезным при предварительной обработке данных перед задачей предсказания:
|
||||
- Удаление выбросов (шума): `DBSCAN` может помочь в идентификации и удалении выбросов из данных.
|
||||
- Генерация новых признаков: `DBSCAN` может быть использован для генерации новых признаков на основе кластеров.
|
||||
|
||||
### Описание работы
|
||||
#### Описание набора данных
|
||||
Набор данных - набор для определения возможности наличия ССЗ заболеваний у челоека
|
||||
|
||||
Названия столбцов набора данных и их описание:
|
||||
|
||||
* HeartDisease - Имеет ли человек ССЗ (No / Yes),
|
||||
* BMI - Индекс массы тела человека (float),
|
||||
* Smoking - Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (No / Yes),
|
||||
* AlcoholDrinking - Сильно ли человек употребляет алкоголь (No / Yes),
|
||||
* Stroke - Был ли у человека инсульт (No / Yes),
|
||||
* PhysicalHealth - Сколько дней за последний месяц человек чувствовал себя плохо (0-30),
|
||||
* MentalHealth - Сколько дней за последний месяц человек чувствовал себя удручённо (0-30),
|
||||
* DiffWalking - Ииспытывает ли человек трудности при ходьбе (No / Yes),
|
||||
* Sex - Пол (female, male),
|
||||
* AgeCategory - Возрастная категория (18-24, 25-29, 30-34, 35-39, 40-44, 45-49, 50-54, 55-59, 60-64, 65-69, 70-74, 75-79, 80 or older),
|
||||
* Race - Национальная принадлежность человека (White, Black, Hispanic, American Indian/Alaskan Native, Asian, Other),
|
||||
* Diabetic - Был ли у человека диабет (No / Yes),
|
||||
* PhysicalActivity - Занимался ли человек спротом за последний месяц (No / Yes),
|
||||
* GenHealth - Общее самочувствие человека (Excellent, Very good, Good, Fair, Poor),
|
||||
* SleepTime - Сколько человек в среднем спит за 24 часа (0-24),
|
||||
* Asthma - Была ли у человека астма (No / Yes),
|
||||
* KidneyDisease - Было ли у человека заболевание почек (No / Yes),
|
||||
* SkinCancer - Был ли у человека рак кожи (No / Yes).
|
||||
|
||||
Ссылка на страницу набора на kuggle: [Indicators of Heart Disease](https://www.kaggle.com/datasets/kamilpytlak/personal-key-indicators-of-heart-disease/data)
|
||||
|
||||
#### Формулировка задачи
|
||||
Согласно прописанным в литературе варантам использования, `DBSCAN` может помочь в идентификации и удалении выбросов из данных, а также может быть использован для генерации новых признаков на основе кластеров. Исходя из этого сформулируем задачу:
|
||||
> "В наборе данных с помощью `DBSCAN` определить и исключить строки содержащие шум, а также сгенерировать новый признак для данных на сонове кластеров. Проверить результат через решение задачи предсказания моделью линейной регрессии на исходных и модифицированных данных"
|
||||
|
||||
#### Использование алгоритма `DBSCAN`
|
||||
Чтобы эффективно использовать алгоритм `DBSCAN` необходимо правильно определить два параметра: `eps` - радиус окрестности вокруг каждой точки и `min_samples` - минимальное количество точек, которые должны находиться в окрестности, чтобы рассматривать ее как ядро кластера.
|
||||
|
||||
Начнём с получения датасета из csv файла и признаков кластеризации:
|
||||
```python
|
||||
df = pd.read_csv(filein, sep=',').iloc[0:10000]
|
||||
x = df.drop("HeartDisease", axis=1)
|
||||
```
|
||||
> **Warning**
|
||||
>
|
||||
> Алгоритм `DBSCAN` - очень жадная по памяти программа. В худшем случае алгоритм может занимать Q(N^2) оперативной памяти устройства, поэтому исследование получится провести лишь на частичной выборке в 10000 строк данных.
|
||||
|
||||
Для нахождения оптимального значения параметра `eps` воспользуемся методом рассчёта средней плотности данных. Для этого необходимо найти суммы максимальных и минимальных значений каждого признака и взять среднее арифметическое этих двух значений:
|
||||
|
||||
```python
|
||||
eps_opt = (x.max().values.mean() + x.min().values.mean()) / 2
|
||||
```
|
||||
Оптимальное значение параметра `min_samples` будем искать эмпирически. Условимся, что нам будет достаточно разделить высе данные на 6 кластеров (пусть это будут степени риска возникновения ССЗ), но нам нельзя терять в качестве выбросов более 10% данных. Тогда мы будем варьировать параметр `min_samples` от 1 до кол-ва всех данных и закончим эксперимент при выполнении одного из указанных условий:
|
||||
|
||||
```python
|
||||
developed_data = []
|
||||
for i in range(len(x)):
|
||||
if i == 0:
|
||||
continue
|
||||
dbscan = DBSCAN(eps=eps_opt, min_samples=i)
|
||||
clusters = dbscan.fit_predict(x.values)
|
||||
if len(set(clusters)) <= 7:
|
||||
developed_data = clusters
|
||||
break
|
||||
if list(clusters).count(-1) / len(clusters) >= 0.1:
|
||||
developed_data = clusters
|
||||
break
|
||||
```
|
||||
|
||||
Таким образом в массиве `developed_data` мы получим значение кластеров для каждй строки датасета. Добавим её как дополнительный признак.
|
||||
|
||||
График кластеров для значений датасета:
|
||||
|
||||

|
||||
|
||||
#### Решение задачи предсказания
|
||||
Создадим два обучающих модуля. В 1м удалим все строки с кластером `-1`, что указывает на то, что они шум и воспользуемся дополнительным признаком `DBSCAN`:
|
||||
```python
|
||||
df_mod = df.loc[df["DBSCAN"] != -1]
|
||||
x_train_mod = df_mod.drop("HeartDisease", axis=1).iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train_mod = df_mod["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test_mod = df_mod.drop("HeartDisease", axis=1).iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test_mod = df_mod["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
```
|
||||
Во 2м модуле для разделения на выборки оставим исходные данные:
|
||||
```python
|
||||
x_train = df.drop(["HeartDisease", "DBSCAN"], axis=1).iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df.drop(["HeartDisease", "DBSCAN"], axis=1).iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
```
|
||||
Создаим две модели регрессии и на каждой решим задачу предсказания. Вычислим ошибки и построим графики.
|
||||
|
||||
График решения задачи предсказания на модифицированных данных:
|
||||
|
||||

|
||||
|
||||
График решения задачи предсказания на исходных данных:
|
||||
|
||||

|
||||
|
||||
### Вывод
|
||||
Согласно графиком, модель, обученная на исходных данных показала результат лучше, чем модель, обученная на модифицированных данных. Получается, что на данном наборе, используя алгоритм `DBSCAN`, мы не только невероятно увеличиваем затратность памяти на обучение модели, но и отрицательно влияем на результат её работы. Это означает, что использование алгоритма на таком наборе данных абсолютно нецелесообразно.
|
||||
|
||||
Связанно это может быть с большим количеством бинарных признаков в данных. В таких случаях задачи кластеризации решаются сравнительно хуже.
|
||||
BIN
arutunyan_dmitry_lab_4/dbscan.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
96
arutunyan_dmitry_lab_4/main.py
Normal file
@@ -0,0 +1,96 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from sklearn import metrics
|
||||
from sklearn.cluster import DBSCAN
|
||||
from sklearn.linear_model import LinearRegression
|
||||
|
||||
filein = "P:\\ULSTU\\ИИС\\Datasets\\heart_2020_norm.csv"
|
||||
fileout = "P:\\ULSTU\\ИИС\\Datasets\\heart_2020_classified.csv"
|
||||
|
||||
|
||||
# Метод устранения шумов и кластеризации данных алгоритмом DBSCAN
|
||||
def dbscan():
|
||||
df = pd.read_csv(filein, sep=',').iloc[0:10000] # Считывание датасета
|
||||
x = df.drop("HeartDisease", axis=1) # Определение кластеризуемых параметров
|
||||
|
||||
eps_opt = (x.max().values.mean() + x.min().values.mean()) / 2 # Рассчёт опционального радиуса окрестности методом средней плотности
|
||||
|
||||
developed_data = [] # Подбор значения минимального количества точек в окрестности
|
||||
for i in range(len(x)): # - Начинаем с одной точки
|
||||
if i == 0:
|
||||
continue # - Увеличиваем значение кол-ва точек на 1
|
||||
dbscan = DBSCAN(eps=eps_opt, min_samples=i) # - Обучаем модель и получаем массив кластеров
|
||||
clusters = dbscan.fit_predict(x.values)
|
||||
if len(set(clusters)) <= 7: # - Прекращаем увеличивать значение точек, если кол-во кластеров уменьшилось до требуемого
|
||||
developed_data = clusters
|
||||
break
|
||||
if list(clusters).count(-1) / len(clusters) >= 0.1: # - Или если "шум" превышает 10% от данных
|
||||
developed_data = clusters
|
||||
break
|
||||
|
||||
make_plot(x, developed_data)
|
||||
df["DBSCAN"] = developed_data
|
||||
df.to_csv(fileout, index=False) # Сохраняем полученные кластеры как доп. столбец датасета
|
||||
|
||||
|
||||
# Метод оценки эффективности кластеризации DBSCAN
|
||||
def linear_reg(): # Создаём две выборки данных
|
||||
df = pd.read_csv(fileout, sep=',') # В 1й избавляемся от "шумов" и используем столбец кластеров как признак
|
||||
df_mod = df.loc[df["DBSCAN"] != -1]
|
||||
x_train_mod = df_mod.drop("HeartDisease", axis=1).iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train_mod = df_mod["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test_mod = df_mod.drop("HeartDisease", axis=1).iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test_mod = df_mod["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
# Во 2й оставляем обычные данные
|
||||
x_train = df.drop(["HeartDisease", "DBSCAN"], axis=1).iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df.drop(["HeartDisease", "DBSCAN"], axis=1).iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
|
||||
lr_mod = LinearRegression() # Обучаем модель без "шума" и с признаком кластеров
|
||||
lr_mod.fit(x_train_mod.values, y_train_mod.values)
|
||||
y_mod_pred = lr_mod.predict(x_test_mod.values)
|
||||
err = pred_errors(y_mod_pred, y_test_mod.values)
|
||||
make_plots(y_test_mod.values, y_mod_pred, err[0], err[1], "Регрессия с кластеризацией dbscan")
|
||||
|
||||
lr = LinearRegression() # Обучаем модель на исходных данных
|
||||
lr.fit(x_train.values, y_train.values)
|
||||
y_pred = lr.predict(x_test.values)
|
||||
err = pred_errors(y_pred, y_test.values)
|
||||
make_plots(y_test.values, y_pred, err[0], err[1], "Чистая линейная регрессия")
|
||||
|
||||
|
||||
# Метод рассчёта ошибок
|
||||
def pred_errors(y_predict, y_test):
|
||||
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3) # Рассчёт среднеквадратичной ошибки модели
|
||||
det_kp = np.round(metrics.r2_score (y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
|
||||
return mid_square, det_kp
|
||||
|
||||
|
||||
# Метод отрисовки графиков
|
||||
def make_plots(y_test, y_predict, mid_sqrt, det_kp, title):
|
||||
plt.plot(y_test, c="red", label="\"y\" исходная") # Создание графика исходной функции
|
||||
plt.plot(y_predict, c="green", label="\"y\" предсказанная \n"
|
||||
"Ср^2 = " + str(mid_sqrt) + "\n"
|
||||
"Кд = " + str(det_kp)) # Создание графика предсказанной функции
|
||||
plt.legend(loc='lower left')
|
||||
plt.title(title)
|
||||
plt.savefig('static/' + title + '.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
# Метод построения графика кластеризации
|
||||
def make_plot(x, c):
|
||||
plt.scatter(x.values[:, 0], x.values[:, 13], c=c, cmap='viridis')
|
||||
plt.xlabel('BMI')
|
||||
plt.ylabel('SleepTime')
|
||||
plt.colorbar()
|
||||
plt.title('DBSCAN Clustering')
|
||||
plt.savefig('static/dbscan.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
dbscan()
|
||||
linear_reg()
|
||||
BIN
arutunyan_dmitry_lab_4/reg.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
arutunyan_dmitry_lab_4/regdbscan.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
94
arutunyan_dmitry_lab_5/README.md
Normal file
@@ -0,0 +1,94 @@
|
||||
|
||||
## Лабораторная работа 5. Вариант 4.
|
||||
### Задание
|
||||
Использовать регрессию по варианту для данных из курсовой работы. Самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для
|
||||
решения сформулированной задачи.
|
||||
|
||||
Модель регрессии:
|
||||
|
||||
- Гребневая регрессия `Ridge`.
|
||||
|
||||
### Как запустить
|
||||
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||
```
|
||||
python main.py
|
||||
```
|
||||
После этого в папке `static` сгенерируются 2 графика, по которым оценивается результат выполнения программы.
|
||||
|
||||
### Используемые технологии
|
||||
- Библиотека `numpy`, используемая для обработки массивов данных и вычислений
|
||||
- Библиотека `pyplot`, используемая для построения графиков.
|
||||
- Библиотека `pandas`, используемая для работы с данными для анализа scv формата.
|
||||
- Библиотека `sklearn` - большой набор функционала для анализа данных. Из неё были использованы инструменты:
|
||||
- `Ridge` - инструмент работы с моделью "Гребневая регрессия"
|
||||
- `metrics` - набор инструменов для оценки моделей
|
||||
|
||||
`Ridge` - это линейная регрессионная модель с регуляризацией L2, которая может быть использована для решения задачи регрессии.
|
||||
|
||||
### Описание работы
|
||||
#### Описание набора данных
|
||||
Набор данных - набор для определения возможности наличия ССЗ заболеваний у челоека
|
||||
|
||||
Названия столбцов набора данных и их описание:
|
||||
|
||||
* HeartDisease - Имеет ли человек ССЗ (No / Yes),
|
||||
* BMI - Индекс массы тела человека (float),
|
||||
* Smoking - Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (No / Yes),
|
||||
* AlcoholDrinking - Сильно ли человек употребляет алкоголь (No / Yes),
|
||||
* Stroke - Был ли у человека инсульт (No / Yes),
|
||||
* PhysicalHealth - Сколько дней за последний месяц человек чувствовал себя плохо (0-30),
|
||||
* MentalHealth - Сколько дней за последний месяц человек чувствовал себя удручённо (0-30),
|
||||
* DiffWalking - Ииспытывает ли человек трудности при ходьбе (No / Yes),
|
||||
* Sex - Пол (female, male),
|
||||
* AgeCategory - Возрастная категория (18-24, 25-29, 30-34, 35-39, 40-44, 45-49, 50-54, 55-59, 60-64, 65-69, 70-74, 75-79, 80 or older),
|
||||
* Race - Национальная принадлежность человека (White, Black, Hispanic, American Indian/Alaskan Native, Asian, Other),
|
||||
* Diabetic - Был ли у человека диабет (No / Yes),
|
||||
* PhysicalActivity - Занимался ли человек спротом за последний месяц (No / Yes),
|
||||
* GenHealth - Общее самочувствие человека (Excellent, Very good, Good, Fair, Poor),
|
||||
* SleepTime - Сколько человек в среднем спит за 24 часа (0-24),
|
||||
* Asthma - Была ли у человека астма (No / Yes),
|
||||
* KidneyDisease - Было ли у человека заболевание почек (No / Yes),
|
||||
* SkinCancer - Был ли у человека рак кожи (No / Yes).
|
||||
|
||||
Ссылка на страницу набора на kuggle: [Indicators of Heart Disease](https://www.kaggle.com/datasets/kamilpytlak/personal-key-indicators-of-heart-disease/data)
|
||||
|
||||
#### Формулировка задачи
|
||||
Поскольку модель гребневой регрессии используется для решения задачи регресси, то попробуем на ней предсказать поведение параметров при обучении на всех признаках, и на значимых признаках, найденных ранее в лабораторной №3. Сформулируем задачу:
|
||||
> "Решить задачу предсказания с помощью моделей гребневой регрессии, обученных на всех признаках и только на значимых признаках. Сравнить результаты работы моделей"
|
||||
|
||||
#### Решение задачи предсказания
|
||||
|
||||
Создадим два обучающих модуля. В 1й включим все признаки. Разделим даныые на выборки. Пусть обучающая выборка будет 99% данных, а тестовая - 1% соответсвенно:
|
||||
```python
|
||||
x_train = df.drop("HeartDisease", axis=1).iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df.drop("HeartDisease", axis=1).iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
```
|
||||
Тогда во 2м модуле используем только признаки, названные значимыми в 3й лабораторной, а именно:
|
||||
* BMI
|
||||
* SleepTime
|
||||
* PhysicalHealth
|
||||
* GenHealth
|
||||
* MentalHealth
|
||||
* AgeCategory
|
||||
* Race
|
||||
* PhysicalActivity
|
||||
|
||||
Обучим две модели гребневой регнессии на данных из разных модулей. Решим задачу предсказания, найдём ошибки и построим графики.
|
||||
|
||||
График решения задачи предсказания моделью гребневой регрессии с использованием всех признаков:
|
||||
|
||||

|
||||
|
||||
График решения задачи предсказания моделью гребневой регрессии с использованием значимых признаков:
|
||||
|
||||

|
||||
|
||||
### Вывод
|
||||
Согласно графиком, среднеквадратическая ошибка обеих моделей достаточна низкая. что свидетельствует достаточно точному соответствию истиных и полученных значений, однако коэффициент детерминации моделей имеет очень низкое значение, что свидетельствует практически полному непониманию модели зависимостей в данных.
|
||||
> **Note**
|
||||
>
|
||||
> Модель `Ridge` имеет коэффициент регуляризации `alpha`, который помогает избавиться модели от переобучения, однако даже при стандартном его значении в единицу, модель показывает очень низкий коэффициент детерминации, поэтому варьирование его значения не принесёт никаких результатов.
|
||||
|
||||
Исходя из полученных результатов можно сделать вывод, что модель гребневой регрессии неприменима к данному набору данных.
|
||||
BIN
arutunyan_dmitry_lab_5/all.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
arutunyan_dmitry_lab_5/imp.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
65
arutunyan_dmitry_lab_5/main.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from sklearn import metrics
|
||||
from sklearn.linear_model import Ridge
|
||||
|
||||
filein = "P:\\ULSTU\\ИИС\\Datasets\\heart_2020_norm.csv"
|
||||
|
||||
|
||||
# Метод решения задачи предсказания на всех признаках данных
|
||||
def ridge_all():
|
||||
df = pd.read_csv(filein, sep=',')
|
||||
|
||||
x_train = df.drop("HeartDisease", axis=1).iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df.drop("HeartDisease", axis=1).iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
|
||||
rid = Ridge(alpha=1.0)
|
||||
rid.fit(x_train.values, y_train.values)
|
||||
y_predict = rid.predict(x_test.values)
|
||||
err = pred_errors(y_predict, y_test.values)
|
||||
make_plots(y_test.values, y_predict, err[0], err[1], "Гребневая регрессия (все признаки)")
|
||||
|
||||
|
||||
# Метод решения задачи предсказания на значимых признаках данных
|
||||
def ridge_valuable():
|
||||
df = pd.read_csv(filein, sep=',')
|
||||
|
||||
x_train = df[["BMI", "PhysicalHealth", "MentalHealth", "AgeCategory", "Race",
|
||||
"PhysicalActivity", "GenHealth", "SleepTime", ]].iloc[0:round(len(df) / 100 * 99)]
|
||||
y_train = df["HeartDisease"].iloc[0:round(len(df) / 100 * 99)]
|
||||
x_test = df[["BMI", "PhysicalHealth", "MentalHealth", "AgeCategory", "Race",
|
||||
"PhysicalActivity", "GenHealth", "SleepTime", ]].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
y_test = df["HeartDisease"].iloc[round(len(df) / 100 * 99):len(df)]
|
||||
|
||||
rid = Ridge(alpha=1.0)
|
||||
rid.fit(x_train.values, y_train.values)
|
||||
y_predict = rid.predict(x_test.values)
|
||||
err = pred_errors(y_predict, y_test.values)
|
||||
make_plots(y_test.values, y_predict, err[0], err[1], "Гребневая регрессия (значимые признаки)")
|
||||
|
||||
|
||||
# Метод рассчёта ошибок
|
||||
def pred_errors(y_predict, y_test):
|
||||
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3) # Рассчёт среднеквадратичной ошибки модели
|
||||
det_kp = np.round(metrics.r2_score (y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
|
||||
return mid_square, det_kp
|
||||
|
||||
|
||||
# Метод отрисовки графиков
|
||||
def make_plots(y_test, y_predict, mid_sqrt, det_kp, title):
|
||||
plt.plot(y_test, c="red", label="\"y\" исходная") # Создание графика исходной функции
|
||||
plt.plot(y_predict, c="green", label="\"y\" предсказанная \n"
|
||||
"Ср^2 = " + str(mid_sqrt) + "\n"
|
||||
"Кд = " + str(det_kp)) # Создание графика предсказанной функции
|
||||
plt.legend(loc='lower left')
|
||||
plt.title(title)
|
||||
plt.savefig('static/' + title + '.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
ridge_all()
|
||||
ridge_valuable()
|
||||
BIN
arutunyan_dmitry_lab_6/1.png
Normal file
|
After Width: | Height: | Size: 216 KiB |
BIN
arutunyan_dmitry_lab_6/2.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
110
arutunyan_dmitry_lab_6/README.md
Normal file
@@ -0,0 +1,110 @@
|
||||
|
||||
## Лабораторная работа 6. Вариант 4.
|
||||
### Задание
|
||||
Использовать нейронную сеть `MLPRegressor` для данных из курсовой работы. Самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для решения сформулированной задачи.
|
||||
|
||||
### Как запустить
|
||||
Для запуска программы необходимо с помощью командной строки в корневой директории файлов прокета прописать:
|
||||
```
|
||||
python main.py
|
||||
```
|
||||
После этого в папке `static` сгенерируются график, по которому оценивается результат выполнения программы.
|
||||
|
||||
### Используемые технологии
|
||||
- Библиотека `numpy`, используемая для обработки массивов данных и вычислений
|
||||
- Библиотека `pyplot`, используемая для построения графиков.
|
||||
- Библиотека `pandas`, используемая для работы с данными для анализа scv формата.
|
||||
- Библиотека `sklearn` - большой набор функционала для анализа данных. Из неё были использованы инструменты:
|
||||
- `train_test_split` - разделитель данных на обучающиую и тестовую выборки
|
||||
- `metrics` - набор инструменов для оценки моделей
|
||||
- `MLPRegressor` - инструмент работы с моделью "Многослойный перцептрон для задачи регрессии"
|
||||
|
||||
`MLPRegressor` - это тип искусственной нейронной сети, состоящей из нескольких слоев нейронов, включая входной слой, скрытые слои и выходной слой.
|
||||
Этот класс позволяет создавать и обучать MLP-модель для предсказания непрерывных числовых значений.
|
||||
|
||||
### Описание работы
|
||||
#### Описание набора данных
|
||||
Набор данных - набор для определения возможности наличия ССЗ заболеваний у челоека
|
||||
|
||||
Названия столбцов набора данных и их описание:
|
||||
|
||||
* HeartDisease - Имеет ли человек ССЗ (No / Yes),
|
||||
* BMI - Индекс массы тела человека (float),
|
||||
* Smoking - Выкурил ли человек хотя бы 5 пачек сигарет за всю жизнь (No / Yes),
|
||||
* AlcoholDrinking - Сильно ли человек употребляет алкоголь (No / Yes),
|
||||
* Stroke - Был ли у человека инсульт (No / Yes),
|
||||
* PhysicalHealth - Сколько дней за последний месяц человек чувствовал себя плохо (0-30),
|
||||
* MentalHealth - Сколько дней за последний месяц человек чувствовал себя удручённо (0-30),
|
||||
* DiffWalking - Ииспытывает ли человек трудности при ходьбе (No / Yes),
|
||||
* Sex - Пол (female, male),
|
||||
* AgeCategory - Возрастная категория (18-24, 25-29, 30-34, 35-39, 40-44, 45-49, 50-54, 55-59, 60-64, 65-69, 70-74, 75-79, 80 or older),
|
||||
* Race - Национальная принадлежность человека (White, Black, Hispanic, American Indian/Alaskan Native, Asian, Other),
|
||||
* Diabetic - Был ли у человека диабет (No / Yes),
|
||||
* PhysicalActivity - Занимался ли человек спротом за последний месяц (No / Yes),
|
||||
* GenHealth - Общее самочувствие человека (Excellent, Very good, Good, Fair, Poor),
|
||||
* SleepTime - Сколько человек в среднем спит за 24 часа (0-24),
|
||||
* Asthma - Была ли у человека астма (No / Yes),
|
||||
* KidneyDisease - Было ли у человека заболевание почек (No / Yes),
|
||||
* SkinCancer - Был ли у человека рак кожи (No / Yes).
|
||||
|
||||
Ссылка на страницу набора на kuggle: [Indicators of Heart Disease](https://www.kaggle.com/datasets/kamilpytlak/personal-key-indicators-of-heart-disease/data)
|
||||
|
||||
#### Формулировка задачи
|
||||
Поскольку модель `MLPRegressor` используется для решения задачи регресси, то попробуем на ней предсказать поведение параметров при обучении на всех признаках, варьируя конфигурации модели. Сформулируем задачу:
|
||||
> "Решить задачу предсказания с помощью нейронной сети, обученной на всех признаках при различных конфигурациях. Сравнить результаты работы моделей"
|
||||
|
||||
#### Решение задачи предсказания
|
||||
Из csv файла выргузим набор данных, выделим параметр для предсказания - (столбец `HeartDisease`), и его признаки - все остальные столбцы. Разделим данные на обучающую и тестовые выборки, при условии, что 99.9% данных - для обучения, а остальные для тестов:
|
||||
```python
|
||||
х, y = [df.drop("HeartDisease", axis=1).values, df["HeartDisease"].values]
|
||||
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.001, random_state=42)
|
||||
```
|
||||
Создадим класс нейронной сети и определим варьируемые конфигурации.
|
||||
|
||||
`hidden_layer_sizes ` - параметр, принимающий на вход количество скрытых слоёв нейронной сети и количество нейронов в каждом слое. Для определения его наилучшего значения необходимо взять минимальное количество слоёв и нейронов в слое и постепенно увеличивать его, до тех пор, пока качество модели не перестанет улучшаться или не будет достаточным.
|
||||
> **Note**
|
||||
>
|
||||
> Экспериментально для нейронной сети `MLPRegressor` было выявленно наилучшее значение равное 100 слоям нейронной сети по 50 нейронов в каждой. Для прелоставления данных процесс оказался очень длительным, поэтому будет указан только наилучший результат.
|
||||
|
||||
`activation` - функция активации. В классе представлена 4мя решениями:
|
||||
- `identity` - функция `f(x) = x`, абсолютно линейная идентичная функция для приведения работы нейронной сети ближе к модели линейной регрессии,
|
||||
- `logistic` - логистическая сигмовидная функция вида `f(x) = 1 / (1 + exp(-x))`,
|
||||
- `tanh` - гиперболическая функция тангенса `f(x) = tanh(x)`,
|
||||
- `relu` - функция выпрямленной линейной единицы измерения `f(x) = max(0, x)`, проверяет больше ли х нуля (используется чаще всего).
|
||||
|
||||
`solver` - метод оптимизации весов. Существует в 3х вариациях:
|
||||
- `Bfgs` - оптимизатор из семейства квазиньютоновских методов,
|
||||
> **Warning**
|
||||
>
|
||||
> Оптимизатор из семейства квазиньютоновских методов показал себя как очень жадный по времени выполнения алгоритм при этом использующий большие коэфициенты весов, что приводило к едиичным, но слишком большим погрешностям на данных. Поэтому в эксперименте варьирования он не принимал участия.
|
||||
|
||||
- `sgd` - метод стозастического градиентного спуска (классика),
|
||||
- `adam` - оптимизированный метод стозастического градиентного спуска Кингмы, Дидерика и Джимми Барнсома.
|
||||
|
||||
```python
|
||||
mlp = MLPRegressor(hidden_layer_sizes=(100, 50), activation='relu', solver='adam', random_state=42)
|
||||
mlp.fit(x_train, y_train)
|
||||
y_predict = mlp.predict(x_test)
|
||||
err = pred_errors(y_predict, y_test)
|
||||
```
|
||||
Проведём эксперимент варьирования конфигураций, посчитаем ошибки предсказания и выберем наилучшую нейронную сеть.
|
||||
|
||||
#### Эксперимент варьирования
|
||||
Рассмотрим различные функции активации.
|
||||
|
||||
Графики решения задачи предсказания на разных функциях активации:
|
||||
|
||||

|
||||
|
||||
Теперь для выбранной функции подберём лучший метод оптимизации весов.
|
||||
|
||||
Грфики решения задачи предсказания на разных методах оптимизации весов:
|
||||
|
||||

|
||||
|
||||
### Вывод
|
||||
Согласно графиком, наилучшие результаты показала нейронаая сеть с функцией активации гиперболического тангенса `tanh` и методом оптимизации весов путём оптимизированного стозастического градиентного спуска Кингмы, Дидерика и Джимми Барнсома `adam`.
|
||||
|
||||
В целом нейронная сеть справилась неудовлетворительно с задачей предсказания, показав хоть и небольшую среднеквадратическую ошибку в 0.25, но очень низкий коэфициент детерминации в 0.23 максимально.
|
||||
|
||||
Это значит, что теоретически модель может предсказать результат по признакам, однако понимания зависимостей результата от последних у неё мало.
|
||||
46
arutunyan_dmitry_lab_6/main.py
Normal file
@@ -0,0 +1,46 @@
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from matplotlib import pyplot as plt
|
||||
from sklearn import metrics
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.neural_network import MLPRegressor
|
||||
|
||||
filein = "P:\\ULSTU\\ИИС\\Datasets\\heart_2020_norm.csv"
|
||||
|
||||
|
||||
# Метод обучения нейронной сети
|
||||
def reg_neural_net():
|
||||
df = pd.read_csv(filein, sep=',')
|
||||
x, y = [df.drop("HeartDisease", axis=1).values,
|
||||
df["HeartDisease"].values]
|
||||
|
||||
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.001, random_state=42)
|
||||
|
||||
mlp = MLPRegressor(hidden_layer_sizes=(100, 50), activation='tanh', solver='adam', random_state=15000)
|
||||
mlp.fit(x_train, y_train)
|
||||
y_predict = mlp.predict(x_test)
|
||||
err = pred_errors(y_predict, y_test)
|
||||
make_plots(y_test, y_predict, err[0], err[1], "Нейронная сеть")
|
||||
|
||||
|
||||
# Метод рассчёта ошибок
|
||||
def pred_errors(y_predict, y_test):
|
||||
mid_square = np.round(np.sqrt(metrics.mean_squared_error(y_test, y_predict)),3) # Рассчёт среднеквадратичной ошибки модели
|
||||
det_kp = np.round(metrics.r2_score(y_test, y_predict), 2) # Рассчёт коэфициента детерминации модели
|
||||
return mid_square, det_kp
|
||||
|
||||
|
||||
# Метод отрисовки графиков
|
||||
def make_plots(y_test, y_predict, mid_sqrt, det_kp, title):
|
||||
plt.plot(y_test, c="red", label="\"y\" исходная") # Создание графика исходной функции
|
||||
plt.plot(y_predict, c="green", label="\"y\" предсказанная \n"
|
||||
"Ср^2 = " + str(mid_sqrt) + "\n"
|
||||
"Кд = " + str(det_kp)) # Создание графика предсказанной функции
|
||||
plt.legend(loc='lower left')
|
||||
plt.title(title)
|
||||
plt.savefig('static/' + title + '.png')
|
||||
plt.close()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
reg_neural_net()
|
||||
BIN
gordeeva_anna_lab_2/Lasso_screen.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
gordeeva_anna_lab_2/RFE_screen.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
gordeeva_anna_lab_2/RandLasso_screen.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
97
gordeeva_anna_lab_2/lab2.py
Normal file
@@ -0,0 +1,97 @@
|
||||
import streamlit as st
|
||||
import numpy as np
|
||||
from sklearn.linear_model import Lasso
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
from sklearn.linear_model import LassoCV
|
||||
from sklearn.feature_selection import SelectFromModel
|
||||
from sklearn.feature_selection import RFE
|
||||
|
||||
st.header("Лабораторная работа 2. Вариант 7. Лассо, случайное лассо, рекурсивное сокращение признаков")
|
||||
|
||||
# генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков
|
||||
np.random.seed(0) #делаем случайные числа предсказуемыми, чтобы при каждом сбросе, рандомные числа были одинаковы
|
||||
size = 750
|
||||
X = np.random.uniform(0, 1, (size, 14))
|
||||
# Задаем функцию-выход: регрессионную проблему Фридмана
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
|
||||
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1))
|
||||
# Добавляем зависимость признаков
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
|
||||
|
||||
|
||||
# Создание списка пар в формате: номер признака - средняя оценка
|
||||
names = ["x%s" % i for i in range(1, 15)] # Список имен признаков
|
||||
|
||||
def random_lasso(X, Y, n_subsets=100):
|
||||
n_samples, n_features = X.shape
|
||||
selected_features = np.zeros(n_features)
|
||||
|
||||
for _ in range(n_subsets):
|
||||
# Создаем случайное подмножество признаков
|
||||
subset_indices = np.random.choice(n_features, int(n_features * 0.7), replace=False)
|
||||
X_subset = X[:, subset_indices]
|
||||
|
||||
# Создаем LassoCV модель
|
||||
lasso_cv = LassoCV(alphas=[0.05])
|
||||
|
||||
# Обучаем модель на подмножестве признаков
|
||||
lasso_cv.fit(X_subset, Y)
|
||||
|
||||
# Определяем, какие признаки были выбраны
|
||||
selected_features[subset_indices] += (lasso_cv.coef_ != 0)
|
||||
|
||||
# Вычисляем, какие признаки были выбраны чаще всего
|
||||
most_selected_features = np.where(selected_features > n_subsets / 2)[0]
|
||||
|
||||
return most_selected_features
|
||||
|
||||
def rank_to_dict(ranks, name):
|
||||
ranks = np.abs(ranks)
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(-1, 1)).ravel()
|
||||
ranks = list(map(lambda x: round(x, 2), ranks))
|
||||
ranked_features = list(zip(name, ranks))
|
||||
return ranked_features
|
||||
|
||||
def mean_rank(ranks):
|
||||
total = sum(rank for _, rank in ranks)
|
||||
return total / len(ranks)
|
||||
|
||||
# Переключатели
|
||||
lasso_check = st.checkbox("Лассо")
|
||||
random_lasso_check = st.checkbox("Случайное лассо")
|
||||
RFE_check = st.checkbox("Рекурсивное сокращение признаков")
|
||||
|
||||
# Результаты
|
||||
if lasso_check:
|
||||
model_lasso = Lasso(alpha=.05)
|
||||
model_lasso.fit(X, Y)
|
||||
rank = rank_to_dict(model_lasso.coef_, names)
|
||||
mean = mean_rank(rank)
|
||||
st.write("Получившиеся оценки для каждого признака")
|
||||
st.table(rank)
|
||||
st.write("Средняя оценка: ", mean)
|
||||
|
||||
if random_lasso_check:
|
||||
selected_features = random_lasso(X, Y)
|
||||
X_subset = X[:, selected_features]
|
||||
lasso_cv = LassoCV(alphas=[0.05])
|
||||
lasso_cv.fit(X_subset, Y)
|
||||
rank = rank_to_dict(lasso_cv.coef_, [names[i] for i in selected_features])
|
||||
mean = mean_rank(rank)
|
||||
st.write("Получившиеся оценки")
|
||||
st.table(rank)
|
||||
st.write("Средняя оценка: ", mean)
|
||||
|
||||
if RFE_check:
|
||||
model_lasso = Lasso(alpha=0.05)
|
||||
rfe = RFE(model_lasso, n_features_to_select=4)
|
||||
rfe.fit(X, Y)
|
||||
selected_feature_indices = rfe.support_
|
||||
selected_feature_names = [name for i, name in enumerate(names) if selected_feature_indices[i]]
|
||||
rank = rank_to_dict(rfe.ranking_, selected_feature_names)
|
||||
mean = mean_rank(rank)
|
||||
st.write("Получившиеся оценки")
|
||||
st.table(rank)
|
||||
st.write("Средняя оценка: ", mean)
|
||||
|
||||
56
gordeeva_anna_lab_2/readme.md
Normal file
@@ -0,0 +1,56 @@
|
||||
## Задание
|
||||
Модели:
|
||||
* Лассо (Lasso)
|
||||
* Случайное лассо (RandomizedLasso)
|
||||
* Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE)
|
||||
|
||||
## В чем различие каждой модели
|
||||
|
||||
Лассо (Lasso) автоматически отбирает наиболее важные признаки и уменьшает влияние менее важных.
|
||||
|
||||
Случайное лассо (RandomizedLasso) случайным образом выбирает подмножества признаков из исходных данных и применяет Лассо к каждому из них. Затем он объединяет результаты и определяет, какие признаки были выбраны чаще всего.
|
||||
|
||||
Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE) оценивает важность каждого признака. Затем он удаляет наименее важный признак и повторяет процесс, пока не останется желаемое количество признаков.
|
||||
|
||||
|
||||
## Библиотеки
|
||||
Streamlit. Предоставляет простой способ создания веб-приложений для визуализации данных.
|
||||
|
||||
Numpy. Предоставляет возможность работать с массивами и матрицами.
|
||||
|
||||
Sklearn. Предоставляет инструменты и алгоритмы, которые упрощают задачи, связанные с машинным обучением.
|
||||
|
||||
## Функционал
|
||||
* Генерация исходных данных из 750 строк-наблюдений и 14 столбцов-признаков
|
||||
* Создание и обучение таких моделей, как лассо, случайное лассо и рекурсивное сокращение признаков.
|
||||
* Вывод получившихся оценок для признаков и средней оценки.
|
||||
|
||||
## Запуск
|
||||
Перед запуском необходимо запустить виртуальную среду venv. Так как я использую streamlit, то для запуска необходимо в терминал прописать следующую строку:
|
||||
```
|
||||
streamlit run lab1.py
|
||||
```
|
||||
Приложение развернется на локальном сервере и автоматически откроется в браузере.
|
||||
|
||||
## Скриншоты работы программы
|
||||
Лассо (Lasso)
|
||||
|
||||

|
||||
|
||||
Случайное лассо (RandomizedLasso)
|
||||
|
||||

|
||||
|
||||
Рекурсивное сокращение признаков (Recursive Feature Elimination – RFE)
|
||||
|
||||

|
||||
|
||||
## Вывод
|
||||
Модель лассо выводит все 14 признаков, наиболее важными признаками оказались под индексом
|
||||
1, 2, 4 и 5. Самый важный признак под номером 4. Средняя оценка по всем признакам 0.19.
|
||||
|
||||
Модель случайное лассо выводит наиболее важные признаки, такими признаками являются 1, 2, 4 и 5. Средняя оценка же по этим признакам равна 0.53. Она выше, так как мы исключаем маловажные признаки.
|
||||
|
||||
Модель рекурсивного сокращения признаков выводит 4 признака, так как я указала именно вывод 4 признаков в коде программы. Таким образом, модель отсекает маловажные признаки. Самым важным признаком оказался под номером 4. Средняя оценка: 0.25.
|
||||
|
||||
Как итог, можно сказать, что наиболее важными признаками являются 1, 2, 4 и 5. А самым важным из них является признак под номером 4.
|
||||
35
ilbekov_dmitriy_lab_1/README.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Лабораторная работа 1
|
||||
### Вариант 10
|
||||
|
||||
### Данные:
|
||||
- make_moons (noise=0.3, random_state=rs)
|
||||
### Модели:
|
||||
- Линейную регрессию
|
||||
- Многослойный персептрон с 10-ю нейронами в скрытом слое (alpha = 0.01)
|
||||
- Многослойный персептрон со 100-а нейронами в скрытом слое (alpha = 0.01)
|
||||
### Запуск
|
||||
- Запустить файл lab1.py
|
||||
|
||||
### Технологии
|
||||
- Язык - 'Python'
|
||||
- Библиотеки sklearn, matplotlib, numpy
|
||||
|
||||
### Что делает
|
||||
Программа генерирует набор данных с помощью make_moons(), после чего строит графики для моделей, указанных в задании варианта и выводит в консоль качество данных моделей
|
||||
|
||||
### Пример работы
|
||||
Вывод в консоль:
|
||||
|
||||
Точность:
|
||||
|
||||
LinearRegression: 0.1997177824893414
|
||||
|
||||
Multi Layer Perceptron 10 нейронов: 0.45
|
||||
|
||||
Multi Layer Perceptron 100 нейронов: 0.8
|
||||
|
||||
Лучший результат показала модель Multi Layer Perceptron на 100 нейронах
|
||||
|
||||
Ниже представлены графики, выводимые программой
|
||||
|
||||

|
||||
BIN
ilbekov_dmitriy_lab_1/console.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
ilbekov_dmitriy_lab_1/graphics.png
Normal file
|
After Width: | Height: | Size: 101 KiB |
103
ilbekov_dmitriy_lab_1/lab1.py
Normal file
@@ -0,0 +1,103 @@
|
||||
import numpy as np
|
||||
from sklearn import metrics
|
||||
from sklearn.datasets import make_moons
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.linear_model import LinearRegression
|
||||
from sklearn.neural_network import MLPClassifier
|
||||
from sklearn.metrics import accuracy_score
|
||||
from matplotlib import pyplot as plt
|
||||
|
||||
#Задание случайного состояния
|
||||
rs = 35
|
||||
# Генерации синтетического набора данных в форме двух полумесяцев
|
||||
# noise - уровень шума данных
|
||||
# random_state устанавливается в rs для воспроизводимости данных
|
||||
X, y = make_moons(noise=0.3, random_state=rs)
|
||||
|
||||
# test_size какой процент данных пойдет в тестирование
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=rs)
|
||||
|
||||
# Подготовка для визуализации
|
||||
x_minimal, x_maximum = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
|
||||
y_minimal, y_maximum = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
|
||||
xx, yy = np.meshgrid(np.arange(x_minimal, x_maximum, 0.02), np.arange(y_minimal, y_maximum, 0.02))
|
||||
|
||||
|
||||
# ЛИНЕЙНАЯ РЕГРЕССИЯ
|
||||
|
||||
# Инициализация модели
|
||||
linear_regression = LinearRegression()
|
||||
# Обучение
|
||||
linear_regression.fit(X_train, y_train)
|
||||
# Предсказание
|
||||
y_pred_linear_regression = linear_regression.predict(X_test)
|
||||
# Оценка точности (MSE)
|
||||
accuracy_linear_regression = metrics.mean_squared_error(y_test, y_pred_linear_regression)
|
||||
# Предсказание класса для каждой точки в сетке графика и изменение формы результата
|
||||
Z_linear_regression = linear_regression.predict(np.c_[xx.ravel(), yy.ravel()])
|
||||
Z_linear_regression = Z_linear_regression.reshape(xx.shape)
|
||||
|
||||
|
||||
# МНОГОСЛОЙНЫЙ ПЕРСЕПТРОН (10)
|
||||
|
||||
# Инициализация модели
|
||||
multi_layer_perceptron_10 = MLPClassifier(hidden_layer_sizes=(10,), alpha=0.01, random_state=rs)
|
||||
# Обучение
|
||||
multi_layer_perceptron_10.fit(X_train, y_train)
|
||||
# Предсказание
|
||||
y_pred_multi_layer_perceptron_10 = multi_layer_perceptron_10.predict(X_test)
|
||||
# Оценка точности каждой модели сравнивается с истинными метками классов на тестовой выборке
|
||||
accuracy_mlp_10 = accuracy_score(y_test, y_pred_multi_layer_perceptron_10)
|
||||
# Предсказание класса для каждой точки в сетке графика и изменение формы результата
|
||||
Z_mlp_10 = multi_layer_perceptron_10.predict(np.c_[xx.ravel(), yy.ravel()])
|
||||
Z_mlp_10 = Z_mlp_10.reshape(xx.shape)
|
||||
|
||||
|
||||
# МНОГОСЛОЙНЫЙ ПЕРСЕПТРОН (100)
|
||||
|
||||
# Инициализация модели
|
||||
multi_layer_perceptron_100 = MLPClassifier(hidden_layer_sizes=(100,), alpha=0.01, random_state=rs)
|
||||
# Обучение
|
||||
multi_layer_perceptron_100.fit(X_train, y_train)
|
||||
# Предсказание
|
||||
y_pred_multi_layer_perceptron_100 = multi_layer_perceptron_100.predict(X_test)
|
||||
# Оценка точности (MSE)
|
||||
accuracy_mlp_100 = accuracy_score(y_test, y_pred_multi_layer_perceptron_100)
|
||||
# Предсказание класса для каждой точки в сетке графика и изменение формы результата
|
||||
Z_mlp_100 = multi_layer_perceptron_100.predict(np.c_[xx.ravel(), yy.ravel()])
|
||||
Z_mlp_100 = Z_mlp_100.reshape(xx.shape)
|
||||
|
||||
|
||||
# ВЫВОД: результаты оценки точности (в консоли) и график
|
||||
print("Точность: ")
|
||||
print("LinearRegression:", accuracy_linear_regression)
|
||||
print("Multi Layer Perceptron 10 нейронов:", accuracy_mlp_10)
|
||||
print("Multi Layer Perceptron 100 нейронов:", accuracy_mlp_100)
|
||||
|
||||
plt.figure(figsize=(12, 9))
|
||||
plt.subplot(221)
|
||||
plt.contourf(xx, yy, Z_linear_regression, alpha=0.8)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', alpha=0.6)
|
||||
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k')
|
||||
plt.title('Линейная регрессия')
|
||||
plt.xlabel('Признак 1')
|
||||
plt.ylabel('Признак 2')
|
||||
|
||||
plt.subplot(222)
|
||||
plt.contourf(xx, yy, Z_mlp_10, alpha=0.8)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', alpha=0.6)
|
||||
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k')
|
||||
plt.title('MLP 10 нейронов')
|
||||
plt.xlabel('Признак 1')
|
||||
plt.ylabel('Признак 2')
|
||||
|
||||
plt.subplot(223)
|
||||
plt.contourf(xx, yy, Z_mlp_100, alpha=0.8)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', alpha=0.6)
|
||||
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, edgecolors='k')
|
||||
plt.title('MLP 100 нейронов')
|
||||
plt.xlabel('Признак 1')
|
||||
plt.ylabel('Признак 2')
|
||||
|
||||
plt.tight_layout()
|
||||
plt.show()
|
||||
23
ilbekov_dmitriy_lab_2/README.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# Лабораторная работа 2
|
||||
### Вариант 10
|
||||
|
||||
### Задание:
|
||||
- Выполнить ранжирование признаков с помощью указанных по варианту моделей
|
||||
### Модели:
|
||||
- Линейная регрессия (LinearRegression)
|
||||
- Лассо (Lasso)
|
||||
- Рекурсивное сокращение признаков (Recursive Feature Elimination –RFE)
|
||||
### Запуск
|
||||
- Запустить файл lab2.py
|
||||
|
||||
### Технологии
|
||||
- Язык - 'Python'
|
||||
- Библиотеки sklearn, numpy
|
||||
|
||||
### Что делает
|
||||
Программа выполняет ранжирование признаков набора данных с помощью моделей, указанных в задании варианта и выводит в консоль результаты ранжирования и топ 4 самых выжных признака
|
||||
|
||||
### Пример работы
|
||||
Пример работы представлен в виде скриншота:
|
||||
|
||||

|
||||
BIN
ilbekov_dmitriy_lab_2/console.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
80
ilbekov_dmitriy_lab_2/lab2.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from sklearn.linear_model import LinearRegression, Lasso
|
||||
from sklearn.feature_selection import RFE
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
import numpy as np
|
||||
|
||||
|
||||
# Генерация синтетических данных
|
||||
def create_data():
|
||||
np.random.seed(0)
|
||||
size = 750
|
||||
X = np.random.uniform(0, 1, (size, 14))
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
|
||||
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1))
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
|
||||
return X, Y
|
||||
|
||||
|
||||
# Нормализация значений рангов
|
||||
def rank_to_dict(ranks):
|
||||
ranks = np.abs(ranks)
|
||||
names = ["x%s" % i for i in range(1, 15)]
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
return dict(zip(names, ranks))
|
||||
|
||||
|
||||
# Вывод отсортированных признаков по важности в табличном виде
|
||||
def print_sorted_features_by_models(ranks_by_model: {}):
|
||||
sorted_ranks = sorted(ranks_by_model.items(), key=lambda item: sum(item[1].values()), reverse=True)
|
||||
|
||||
print("{:<40}".format(""), end="")
|
||||
for i in range(1, 15):
|
||||
print("{:<10}".format(i), end="")
|
||||
print()
|
||||
|
||||
for model, rank_dict in sorted_ranks:
|
||||
sorted_features = sorted(rank_dict.items(), key=lambda item: item[1], reverse=True)
|
||||
print("{:<40}".format(model), end="")
|
||||
for feature, rank in sorted_features:
|
||||
print("{:<10}".format(f"{feature}: {rank}"), end="")
|
||||
print()
|
||||
print()
|
||||
|
||||
|
||||
# Получение средних значений моделей и ТОП 4 самых важных признака
|
||||
def average_values(ranks_by_model: {}):
|
||||
mean = {}
|
||||
for model, rank_dict in ranks_by_model.items():
|
||||
for feature, rank in rank_dict.items():
|
||||
if feature not in mean:
|
||||
mean[feature] = 0
|
||||
mean[feature] += rank
|
||||
mean = {feature: round(rank / len(ranks_by_model), 2) for feature, rank in mean.items()}
|
||||
mean_sorted = sorted(mean.items(), key=lambda item: item[1], reverse=True)
|
||||
print("Средние значения")
|
||||
print(mean_sorted)
|
||||
print("\nТОП 4 самых важных признака по среднему значению: ")
|
||||
for feature, rank in mean_sorted[:4]:
|
||||
print('Признак - {0}, значение важности - {1}'.format(feature, rank))
|
||||
|
||||
|
||||
X, Y = create_data()
|
||||
# ЛИНЕЙНАЯ РЕГРЕССИЯ
|
||||
linear_regression = LinearRegression()
|
||||
linear_regression.fit(X, Y)
|
||||
# ЛАССО
|
||||
lasso = Lasso(alpha=.01)
|
||||
lasso.fit(X, Y)
|
||||
# РЕКУРСИВНОЕ СОКРАЩЕНИЕ ПРИЗНАКОВ
|
||||
rfe = RFE(linear_regression)
|
||||
rfe.fit(X, Y)
|
||||
|
||||
ranks_by_model = {
|
||||
"Линейная регрессия": rank_to_dict(linear_regression.coef_),
|
||||
"Лассо": rank_to_dict(lasso.coef_),
|
||||
"РЕКУРСИВНОЕ СОКРАЩЕНИЕ ПРИЗНАКОВ (RFE)": rank_to_dict(rfe.ranking_),
|
||||
}
|
||||
print_sorted_features_by_models(ranks_by_model)
|
||||
average_values(ranks_by_model)
|
||||
38
lipatov_ilya_lab_2/README.md
Normal file
@@ -0,0 +1,38 @@
|
||||
## Лабораторная работа №2
|
||||
|
||||
### Ранжирование признаков
|
||||
|
||||
## Выполнил студент группы ПИбд-41 Липатов Илья
|
||||
|
||||
### Как запустить лабораторную работу:
|
||||
|
||||
* установить python, numpy, matplotlib, sklearn
|
||||
* запустить проект (стартовая точка класс lab2)
|
||||
|
||||
### Какие технологии использовались:
|
||||
|
||||
* Язык программирования `Python`, библиотеки numpy, matplotlib, sklearn
|
||||
* Среда разработки `PyCharm`
|
||||
|
||||
### Что делает лабораторная работа:
|
||||
|
||||
* генерирует данные и обучает модели модели RandomizedLasso, Ridge,Random Forest Regressor.
|
||||
* ранжирует признаки с помощью моделей RandomizedLasso, Ridge,Random Forest Regressor.
|
||||
* отображает получившиеся значения\оценки каждого признака каждым методом\моделью и среднюю оценку.
|
||||
|
||||
### Примеры работы:
|
||||
|
||||
#### Результаты:
|
||||
* RandomizedLasso: 1, 2, 4, 5
|
||||
* Ridge: 4, 11, 12 и 1 или 2 (одинаковый результат)
|
||||
* Random Forest Regressor: 4, 1 11, 12
|
||||
|
||||
#### Среднее: 4, 1, 2 и 5 признаки
|
||||
|
||||
#### Графики результатов ранжирования признаков по каждой модели и средняя оценка:
|
||||
|
||||

|
||||
|
||||
#### Средние оценки для признаков у каждой модели и средние оценки моделей:
|
||||
|
||||

|
||||
44
lipatov_ilya_lab_2/RandomizedLasso.py
Normal file
@@ -0,0 +1,44 @@
|
||||
from sklearn.utils import check_X_y, check_random_state
|
||||
from sklearn.linear_model import Lasso
|
||||
from scipy.sparse import issparse
|
||||
from pandas._libs import sparse
|
||||
|
||||
|
||||
def _rescale_data(x, weights):
|
||||
if issparse(x):
|
||||
size = weights.shape[0]
|
||||
weight_dia = sparse.dia_matrix((1 - weights, 0), (size, size))
|
||||
x_rescaled = x * weight_dia
|
||||
else:
|
||||
x_rescaled = x * (1 - weights)
|
||||
|
||||
return x_rescaled
|
||||
|
||||
|
||||
class RandomizedLasso(Lasso):
|
||||
def __init__(self, weakness=0.5, alpha=1.0, fit_intercept=True, normalize=False,
|
||||
precompute=False, copy_x=True, max_iter=1000,
|
||||
tol=1e-4, warm_start=False, positive=False,
|
||||
random_state=None, selection='cyclic'):
|
||||
self.weakness = weakness
|
||||
super(RandomizedLasso, self).__init__(
|
||||
alpha=alpha, fit_intercept=fit_intercept,
|
||||
normalize=normalize, precompute=precompute, copy_X=copy_x,
|
||||
max_iter=max_iter, tol=tol, warm_start=warm_start,
|
||||
positive=positive, random_state=random_state,
|
||||
selection=selection)
|
||||
|
||||
def fit(self, x, y):
|
||||
if not isinstance(self.weakness, float) or not (0.0 < self.weakness <= 1.0):
|
||||
raise ValueError('weakness should be a float in (0, 1], got %s' % self.weakness)
|
||||
|
||||
x, y = check_X_y(x, y, accept_sparse=True)
|
||||
|
||||
n_features = x.shape[1]
|
||||
weakness = 1. - self.weakness
|
||||
random_state = check_random_state(self.random_state)
|
||||
|
||||
weights = weakness * random_state.randint(0, 1 + 1, size=(n_features,))
|
||||
|
||||
x_rescaled = _rescale_data(x, weights)
|
||||
return super(RandomizedLasso, self).fit(x_rescaled, y)
|
||||
67
lipatov_ilya_lab_2/lab2.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from sklearn.ensemble import RandomForestRegressor
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
from RandomizedLasso import RandomizedLasso
|
||||
from sklearn.linear_model import Ridge
|
||||
from matplotlib import pyplot as plt
|
||||
import numpy as np
|
||||
|
||||
np.random.seed(0)
|
||||
size = 1000
|
||||
X = np.random.uniform(0, 1, (size, 14))
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 + 10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1))
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
|
||||
|
||||
ridge = Ridge(alpha=1.0)
|
||||
ridge.fit(X, Y)
|
||||
|
||||
lasso = RandomizedLasso(alpha=0.007)
|
||||
lasso.fit(X, Y)
|
||||
|
||||
randForestRegression = RandomForestRegressor(max_depth=4, min_samples_leaf=1, min_impurity_decrease=0, ccp_alpha=0)
|
||||
randForestRegression.fit(X, Y)
|
||||
|
||||
|
||||
def rank_to_dict(ranks, names):
|
||||
ranks = np.abs(ranks)
|
||||
minmax = MinMaxScaler()
|
||||
ranks = minmax.fit_transform(np.array(ranks).reshape(14, 1)).ravel()
|
||||
ranks = map(lambda x: round(x, 2), ranks)
|
||||
return dict(zip(names, ranks))
|
||||
|
||||
|
||||
ranks = {'Ridge': {}, 'RandomizedLasso': {}, 'RandomForestRegressor': {}}
|
||||
names = ["x%s" % i for i in range(1, 15)]
|
||||
|
||||
ranks["Ridge"] = rank_to_dict(ridge.coef_, names)
|
||||
ranks["RandomizedLasso"] = rank_to_dict(lasso.coef_, names)
|
||||
ranks["RandomForestRegressor"] = rank_to_dict(randForestRegression.feature_importances_, names)
|
||||
|
||||
mean = {}
|
||||
|
||||
for key, value in ranks.items():
|
||||
for item in value.items():
|
||||
if item[0] not in mean:
|
||||
mean[item[0]] = 0
|
||||
mean[item[0]] += item[1]
|
||||
|
||||
for key, value in mean.items():
|
||||
res = value / len(ranks)
|
||||
mean[key] = round(res, 2)
|
||||
|
||||
print('VALUES')
|
||||
|
||||
for r in ranks.items():
|
||||
print(r)
|
||||
print('MEAN')
|
||||
print(mean)
|
||||
|
||||
for i, (model_name, features) in enumerate(ranks.items()):
|
||||
subplot = plt.subplot(2, 2, i + 1)
|
||||
subplot.set_title(model_name)
|
||||
subplot.bar(list(features.keys()), list(features.values()))
|
||||
|
||||
subplot = plt.subplot(2, 2, 4)
|
||||
subplot.set_title('Mean')
|
||||
subplot.bar(list(mean.keys()), list(mean.values()))
|
||||
|
||||
plt.show()
|
||||
BIN
lipatov_ilya_lab_2/means.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
lipatov_ilya_lab_2/result.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
27
lipatov_ilya_lab_3/README.md
Normal file
@@ -0,0 +1,27 @@
|
||||
## Лабораторная работа №3
|
||||
|
||||
### Деревья решений
|
||||
|
||||
## Выполнил студент группы ПИбд-41 Липатов Илья
|
||||
|
||||
### Как запустить лабораторную работу:
|
||||
|
||||
* установить python, numpy, matplotlib, sklearn
|
||||
* запустить проект (стартовая точка класс lab3)
|
||||
|
||||
### Какие технологии использовались:
|
||||
|
||||
* Язык программирования `Python`, библиотеки numpy, matplotlib, sklearn
|
||||
* Среда разработки `PyCharm`
|
||||
|
||||
### Что делает лабораторная работа:
|
||||
|
||||
* Выполняет ранжирование признаков для регрессионной модели
|
||||
* По данным "Boston House Prices" решает задачу классификации (с помощью дерева решений), в которой по различным характеристикам требуется найти для "Индекс доступности к радиальным магистралям" два наиболее важных признака из трех рассматриваемых (CRIM (уровень преступности на душу населения в разбивке по городам), DIS (взвешенные расстояния до пяти бостонских центров занятости), TAX (полная стоимость недвижимости - ставка налога на 10 000 долларов США \[$/10 тыс.])).
|
||||
|
||||
### Примеры работы:
|
||||
|
||||
#### Результаты:
|
||||
* Наиболее важным параметром влияющим на трудность похода оказалось TAX (полная стоимость недвижимости - ставка налога на 10 000 долларов США \[$/10 тыс.]), затем CRIM (уровень преступности на душу населения в разбивке по городам) и DIS (взвешенные расстояния до пяти бостонских центров занятости)
|
||||
|
||||

|
||||
507
lipatov_ilya_lab_3/boston.csv
Normal file
@@ -0,0 +1,507 @@
|
||||
CRIM,ZN,INDUS,CHAS,NOX,RM,AGE,DIS,RAD,TAX,PTRATIO,B,LSTAT,MEDV
|
||||
0.00632,18.00,2.310,0,0.5380,6.5750,65.20,4.0900,1,296.0,15.30,396.90,4.98,24.00
|
||||
0.02731,0.00,7.070,0,0.4690,6.4210,78.90,4.9671,2,242.0,17.80,396.90,9.14,21.60
|
||||
0.02729,0.00,7.070,0,0.4690,7.1850,61.10,4.9671,2,242.0,17.80,392.83,4.03,34.70
|
||||
0.03237,0.00,2.180,0,0.4580,6.9980,45.80,6.0622,3,222.0,18.70,394.63,2.94,33.40
|
||||
0.06905,0.00,2.180,0,0.4580,7.1470,54.20,6.0622,3,222.0,18.70,396.90,5.33,36.20
|
||||
0.02985,0.00,2.180,0,0.4580,6.4300,58.70,6.0622,3,222.0,18.70,394.12,5.21,28.70
|
||||
0.08829,12.50,7.870,0,0.5240,6.0120,66.60,5.5605,5,311.0,15.20,395.60,12.43,22.90
|
||||
0.14455,12.50,7.870,0,0.5240,6.1720,96.10,5.9505,5,311.0,15.20,396.90,19.15,27.10
|
||||
0.21124,12.50,7.870,0,0.5240,5.6310,100.00,6.0821,5,311.0,15.20,386.63,29.93,16.50
|
||||
0.17004,12.50,7.870,0,0.5240,6.0040,85.90,6.5921,5,311.0,15.20,386.71,17.10,18.90
|
||||
0.22489,12.50,7.870,0,0.5240,6.3770,94.30,6.3467,5,311.0,15.20,392.52,20.45,15.00
|
||||
0.11747,12.50,7.870,0,0.5240,6.0090,82.90,6.2267,5,311.0,15.20,396.90,13.27,18.90
|
||||
0.09378,12.50,7.870,0,0.5240,5.8890,39.00,5.4509,5,311.0,15.20,390.50,15.71,21.70
|
||||
0.62976,0.00,8.140,0,0.5380,5.9490,61.80,4.7075,4,307.0,21.00,396.90,8.26,20.40
|
||||
0.63796,0.00,8.140,0,0.5380,6.0960,84.50,4.4619,4,307.0,21.00,380.02,10.26,18.20
|
||||
0.62739,0.00,8.140,0,0.5380,5.8340,56.50,4.4986,4,307.0,21.00,395.62,8.47,19.90
|
||||
1.05393,0.00,8.140,0,0.5380,5.9350,29.30,4.4986,4,307.0,21.00,386.85,6.58,23.10
|
||||
0.78420,0.00,8.140,0,0.5380,5.9900,81.70,4.2579,4,307.0,21.00,386.75,14.67,17.50
|
||||
0.80271,0.00,8.140,0,0.5380,5.4560,36.60,3.7965,4,307.0,21.00,288.99,11.69,20.20
|
||||
0.72580,0.00,8.140,0,0.5380,5.7270,69.50,3.7965,4,307.0,21.00,390.95,11.28,18.20
|
||||
1.25179,0.00,8.140,0,0.5380,5.5700,98.10,3.7979,4,307.0,21.00,376.57,21.02,13.60
|
||||
0.85204,0.00,8.140,0,0.5380,5.9650,89.20,4.0123,4,307.0,21.00,392.53,13.83,19.60
|
||||
1.23247,0.00,8.140,0,0.5380,6.1420,91.70,3.9769,4,307.0,21.00,396.90,18.72,15.20
|
||||
0.98843,0.00,8.140,0,0.5380,5.8130,100.00,4.0952,4,307.0,21.00,394.54,19.88,14.50
|
||||
0.75026,0.00,8.140,0,0.5380,5.9240,94.10,4.3996,4,307.0,21.00,394.33,16.30,15.60
|
||||
0.84054,0.00,8.140,0,0.5380,5.5990,85.70,4.4546,4,307.0,21.00,303.42,16.51,13.90
|
||||
0.67191,0.00,8.140,0,0.5380,5.8130,90.30,4.6820,4,307.0,21.00,376.88,14.81,16.60
|
||||
0.95577,0.00,8.140,0,0.5380,6.0470,88.80,4.4534,4,307.0,21.00,306.38,17.28,14.80
|
||||
0.77299,0.00,8.140,0,0.5380,6.4950,94.40,4.4547,4,307.0,21.00,387.94,12.80,18.40
|
||||
1.00245,0.00,8.140,0,0.5380,6.6740,87.30,4.2390,4,307.0,21.00,380.23,11.98,21.00
|
||||
1.13081,0.00,8.140,0,0.5380,5.7130,94.10,4.2330,4,307.0,21.00,360.17,22.60,12.70
|
||||
1.35472,0.00,8.140,0,0.5380,6.0720,100.00,4.1750,4,307.0,21.00,376.73,13.04,14.50
|
||||
1.38799,0.00,8.140,0,0.5380,5.9500,82.00,3.9900,4,307.0,21.00,232.60,27.71,13.20
|
||||
1.15172,0.00,8.140,0,0.5380,5.7010,95.00,3.7872,4,307.0,21.00,358.77,18.35,13.10
|
||||
1.61282,0.00,8.140,0,0.5380,6.0960,96.90,3.7598,4,307.0,21.00,248.31,20.34,13.50
|
||||
0.06417,0.00,5.960,0,0.4990,5.9330,68.20,3.3603,5,279.0,19.20,396.90,9.68,18.90
|
||||
0.09744,0.00,5.960,0,0.4990,5.8410,61.40,3.3779,5,279.0,19.20,377.56,11.41,20.00
|
||||
0.08014,0.00,5.960,0,0.4990,5.8500,41.50,3.9342,5,279.0,19.20,396.90,8.77,21.00
|
||||
0.17505,0.00,5.960,0,0.4990,5.9660,30.20,3.8473,5,279.0,19.20,393.43,10.13,24.70
|
||||
0.02763,75.00,2.950,0,0.4280,6.5950,21.80,5.4011,3,252.0,18.30,395.63,4.32,30.80
|
||||
0.03359,75.00,2.950,0,0.4280,7.0240,15.80,5.4011,3,252.0,18.30,395.62,1.98,34.90
|
||||
0.12744,0.00,6.910,0,0.4480,6.7700,2.90,5.7209,3,233.0,17.90,385.41,4.84,26.60
|
||||
0.14150,0.00,6.910,0,0.4480,6.1690,6.60,5.7209,3,233.0,17.90,383.37,5.81,25.30
|
||||
0.15936,0.00,6.910,0,0.4480,6.2110,6.50,5.7209,3,233.0,17.90,394.46,7.44,24.70
|
||||
0.12269,0.00,6.910,0,0.4480,6.0690,40.00,5.7209,3,233.0,17.90,389.39,9.55,21.20
|
||||
0.17142,0.00,6.910,0,0.4480,5.6820,33.80,5.1004,3,233.0,17.90,396.90,10.21,19.30
|
||||
0.18836,0.00,6.910,0,0.4480,5.7860,33.30,5.1004,3,233.0,17.90,396.90,14.15,20.00
|
||||
0.22927,0.00,6.910,0,0.4480,6.0300,85.50,5.6894,3,233.0,17.90,392.74,18.80,16.60
|
||||
0.25387,0.00,6.910,0,0.4480,5.3990,95.30,5.8700,3,233.0,17.90,396.90,30.81,14.40
|
||||
0.21977,0.00,6.910,0,0.4480,5.6020,62.00,6.0877,3,233.0,17.90,396.90,16.20,19.40
|
||||
0.08873,21.00,5.640,0,0.4390,5.9630,45.70,6.8147,4,243.0,16.80,395.56,13.45,19.70
|
||||
0.04337,21.00,5.640,0,0.4390,6.1150,63.00,6.8147,4,243.0,16.80,393.97,9.43,20.50
|
||||
0.05360,21.00,5.640,0,0.4390,6.5110,21.10,6.8147,4,243.0,16.80,396.90,5.28,25.00
|
||||
0.04981,21.00,5.640,0,0.4390,5.9980,21.40,6.8147,4,243.0,16.80,396.90,8.43,23.40
|
||||
0.01360,75.00,4.000,0,0.4100,5.8880,47.60,7.3197,3,469.0,21.10,396.90,14.80,18.90
|
||||
0.01311,90.00,1.220,0,0.4030,7.2490,21.90,8.6966,5,226.0,17.90,395.93,4.81,35.40
|
||||
0.02055,85.00,0.740,0,0.4100,6.3830,35.70,9.1876,2,313.0,17.30,396.90,5.77,24.70
|
||||
0.01432,100.00,1.320,0,0.4110,6.8160,40.50,8.3248,5,256.0,15.10,392.90,3.95,31.60
|
||||
0.15445,25.00,5.130,0,0.4530,6.1450,29.20,7.8148,8,284.0,19.70,390.68,6.86,23.30
|
||||
0.10328,25.00,5.130,0,0.4530,5.9270,47.20,6.9320,8,284.0,19.70,396.90,9.22,19.60
|
||||
0.14932,25.00,5.130,0,0.4530,5.7410,66.20,7.2254,8,284.0,19.70,395.11,13.15,18.70
|
||||
0.17171,25.00,5.130,0,0.4530,5.9660,93.40,6.8185,8,284.0,19.70,378.08,14.44,16.00
|
||||
0.11027,25.00,5.130,0,0.4530,6.4560,67.80,7.2255,8,284.0,19.70,396.90,6.73,22.20
|
||||
0.12650,25.00,5.130,0,0.4530,6.7620,43.40,7.9809,8,284.0,19.70,395.58,9.50,25.00
|
||||
0.01951,17.50,1.380,0,0.4161,7.1040,59.50,9.2229,3,216.0,18.60,393.24,8.05,33.00
|
||||
0.03584,80.00,3.370,0,0.3980,6.2900,17.80,6.6115,4,337.0,16.10,396.90,4.67,23.50
|
||||
0.04379,80.00,3.370,0,0.3980,5.7870,31.10,6.6115,4,337.0,16.10,396.90,10.24,19.40
|
||||
0.05789,12.50,6.070,0,0.4090,5.8780,21.40,6.4980,4,345.0,18.90,396.21,8.10,22.00
|
||||
0.13554,12.50,6.070,0,0.4090,5.5940,36.80,6.4980,4,345.0,18.90,396.90,13.09,17.40
|
||||
0.12816,12.50,6.070,0,0.4090,5.8850,33.00,6.4980,4,345.0,18.90,396.90,8.79,20.90
|
||||
0.08826,0.00,10.810,0,0.4130,6.4170,6.60,5.2873,4,305.0,19.20,383.73,6.72,24.20
|
||||
0.15876,0.00,10.810,0,0.4130,5.9610,17.50,5.2873,4,305.0,19.20,376.94,9.88,21.70
|
||||
0.09164,0.00,10.810,0,0.4130,6.0650,7.80,5.2873,4,305.0,19.20,390.91,5.52,22.80
|
||||
0.19539,0.00,10.810,0,0.4130,6.2450,6.20,5.2873,4,305.0,19.20,377.17,7.54,23.40
|
||||
0.07896,0.00,12.830,0,0.4370,6.2730,6.00,4.2515,5,398.0,18.70,394.92,6.78,24.10
|
||||
0.09512,0.00,12.830,0,0.4370,6.2860,45.00,4.5026,5,398.0,18.70,383.23,8.94,21.40
|
||||
0.10153,0.00,12.830,0,0.4370,6.2790,74.50,4.0522,5,398.0,18.70,373.66,11.97,20.00
|
||||
0.08707,0.00,12.830,0,0.4370,6.1400,45.80,4.0905,5,398.0,18.70,386.96,10.27,20.80
|
||||
0.05646,0.00,12.830,0,0.4370,6.2320,53.70,5.0141,5,398.0,18.70,386.40,12.34,21.20
|
||||
0.08387,0.00,12.830,0,0.4370,5.8740,36.60,4.5026,5,398.0,18.70,396.06,9.10,20.30
|
||||
0.04113,25.00,4.860,0,0.4260,6.7270,33.50,5.4007,4,281.0,19.00,396.90,5.29,28.00
|
||||
0.04462,25.00,4.860,0,0.4260,6.6190,70.40,5.4007,4,281.0,19.00,395.63,7.22,23.90
|
||||
0.03659,25.00,4.860,0,0.4260,6.3020,32.20,5.4007,4,281.0,19.00,396.90,6.72,24.80
|
||||
0.03551,25.00,4.860,0,0.4260,6.1670,46.70,5.4007,4,281.0,19.00,390.64,7.51,22.90
|
||||
0.05059,0.00,4.490,0,0.4490,6.3890,48.00,4.7794,3,247.0,18.50,396.90,9.62,23.90
|
||||
0.05735,0.00,4.490,0,0.4490,6.6300,56.10,4.4377,3,247.0,18.50,392.30,6.53,26.60
|
||||
0.05188,0.00,4.490,0,0.4490,6.0150,45.10,4.4272,3,247.0,18.50,395.99,12.86,22.50
|
||||
0.07151,0.00,4.490,0,0.4490,6.1210,56.80,3.7476,3,247.0,18.50,395.15,8.44,22.20
|
||||
0.05660,0.00,3.410,0,0.4890,7.0070,86.30,3.4217,2,270.0,17.80,396.90,5.50,23.60
|
||||
0.05302,0.00,3.410,0,0.4890,7.0790,63.10,3.4145,2,270.0,17.80,396.06,5.70,28.70
|
||||
0.04684,0.00,3.410,0,0.4890,6.4170,66.10,3.0923,2,270.0,17.80,392.18,8.81,22.60
|
||||
0.03932,0.00,3.410,0,0.4890,6.4050,73.90,3.0921,2,270.0,17.80,393.55,8.20,22.00
|
||||
0.04203,28.00,15.040,0,0.4640,6.4420,53.60,3.6659,4,270.0,18.20,395.01,8.16,22.90
|
||||
0.02875,28.00,15.040,0,0.4640,6.2110,28.90,3.6659,4,270.0,18.20,396.33,6.21,25.00
|
||||
0.04294,28.00,15.040,0,0.4640,6.2490,77.30,3.6150,4,270.0,18.20,396.90,10.59,20.60
|
||||
0.12204,0.00,2.890,0,0.4450,6.6250,57.80,3.4952,2,276.0,18.00,357.98,6.65,28.40
|
||||
0.11504,0.00,2.890,0,0.4450,6.1630,69.60,3.4952,2,276.0,18.00,391.83,11.34,21.40
|
||||
0.12083,0.00,2.890,0,0.4450,8.0690,76.00,3.4952,2,276.0,18.00,396.90,4.21,38.70
|
||||
0.08187,0.00,2.890,0,0.4450,7.8200,36.90,3.4952,2,276.0,18.00,393.53,3.57,43.80
|
||||
0.06860,0.00,2.890,0,0.4450,7.4160,62.50,3.4952,2,276.0,18.00,396.90,6.19,33.20
|
||||
0.14866,0.00,8.560,0,0.5200,6.7270,79.90,2.7778,5,384.0,20.90,394.76,9.42,27.50
|
||||
0.11432,0.00,8.560,0,0.5200,6.7810,71.30,2.8561,5,384.0,20.90,395.58,7.67,26.50
|
||||
0.22876,0.00,8.560,0,0.5200,6.4050,85.40,2.7147,5,384.0,20.90,70.80,10.63,18.60
|
||||
0.21161,0.00,8.560,0,0.5200,6.1370,87.40,2.7147,5,384.0,20.90,394.47,13.44,19.30
|
||||
0.13960,0.00,8.560,0,0.5200,6.1670,90.00,2.4210,5,384.0,20.90,392.69,12.33,20.10
|
||||
0.13262,0.00,8.560,0,0.5200,5.8510,96.70,2.1069,5,384.0,20.90,394.05,16.47,19.50
|
||||
0.17120,0.00,8.560,0,0.5200,5.8360,91.90,2.2110,5,384.0,20.90,395.67,18.66,19.50
|
||||
0.13117,0.00,8.560,0,0.5200,6.1270,85.20,2.1224,5,384.0,20.90,387.69,14.09,20.40
|
||||
0.12802,0.00,8.560,0,0.5200,6.4740,97.10,2.4329,5,384.0,20.90,395.24,12.27,19.80
|
||||
0.26363,0.00,8.560,0,0.5200,6.2290,91.20,2.5451,5,384.0,20.90,391.23,15.55,19.40
|
||||
0.10793,0.00,8.560,0,0.5200,6.1950,54.40,2.7778,5,384.0,20.90,393.49,13.00,21.70
|
||||
0.10084,0.00,10.010,0,0.5470,6.7150,81.60,2.6775,6,432.0,17.80,395.59,10.16,22.80
|
||||
0.12329,0.00,10.010,0,0.5470,5.9130,92.90,2.3534,6,432.0,17.80,394.95,16.21,18.80
|
||||
0.22212,0.00,10.010,0,0.5470,6.0920,95.40,2.5480,6,432.0,17.80,396.90,17.09,18.70
|
||||
0.14231,0.00,10.010,0,0.5470,6.2540,84.20,2.2565,6,432.0,17.80,388.74,10.45,18.50
|
||||
0.17134,0.00,10.010,0,0.5470,5.9280,88.20,2.4631,6,432.0,17.80,344.91,15.76,18.30
|
||||
0.13158,0.00,10.010,0,0.5470,6.1760,72.50,2.7301,6,432.0,17.80,393.30,12.04,21.20
|
||||
0.15098,0.00,10.010,0,0.5470,6.0210,82.60,2.7474,6,432.0,17.80,394.51,10.30,19.20
|
||||
0.13058,0.00,10.010,0,0.5470,5.8720,73.10,2.4775,6,432.0,17.80,338.63,15.37,20.40
|
||||
0.14476,0.00,10.010,0,0.5470,5.7310,65.20,2.7592,6,432.0,17.80,391.50,13.61,19.30
|
||||
0.06899,0.00,25.650,0,0.5810,5.8700,69.70,2.2577,2,188.0,19.10,389.15,14.37,22.00
|
||||
0.07165,0.00,25.650,0,0.5810,6.0040,84.10,2.1974,2,188.0,19.10,377.67,14.27,20.30
|
||||
0.09299,0.00,25.650,0,0.5810,5.9610,92.90,2.0869,2,188.0,19.10,378.09,17.93,20.50
|
||||
0.15038,0.00,25.650,0,0.5810,5.8560,97.00,1.9444,2,188.0,19.10,370.31,25.41,17.30
|
||||
0.09849,0.00,25.650,0,0.5810,5.8790,95.80,2.0063,2,188.0,19.10,379.38,17.58,18.80
|
||||
0.16902,0.00,25.650,0,0.5810,5.9860,88.40,1.9929,2,188.0,19.10,385.02,14.81,21.40
|
||||
0.38735,0.00,25.650,0,0.5810,5.6130,95.60,1.7572,2,188.0,19.10,359.29,27.26,15.70
|
||||
0.25915,0.00,21.890,0,0.6240,5.6930,96.00,1.7883,4,437.0,21.20,392.11,17.19,16.20
|
||||
0.32543,0.00,21.890,0,0.6240,6.4310,98.80,1.8125,4,437.0,21.20,396.90,15.39,18.00
|
||||
0.88125,0.00,21.890,0,0.6240,5.6370,94.70,1.9799,4,437.0,21.20,396.90,18.34,14.30
|
||||
0.34006,0.00,21.890,0,0.6240,6.4580,98.90,2.1185,4,437.0,21.20,395.04,12.60,19.20
|
||||
1.19294,0.00,21.890,0,0.6240,6.3260,97.70,2.2710,4,437.0,21.20,396.90,12.26,19.60
|
||||
0.59005,0.00,21.890,0,0.6240,6.3720,97.90,2.3274,4,437.0,21.20,385.76,11.12,23.00
|
||||
0.32982,0.00,21.890,0,0.6240,5.8220,95.40,2.4699,4,437.0,21.20,388.69,15.03,18.40
|
||||
0.97617,0.00,21.890,0,0.6240,5.7570,98.40,2.3460,4,437.0,21.20,262.76,17.31,15.60
|
||||
0.55778,0.00,21.890,0,0.6240,6.3350,98.20,2.1107,4,437.0,21.20,394.67,16.96,18.10
|
||||
0.32264,0.00,21.890,0,0.6240,5.9420,93.50,1.9669,4,437.0,21.20,378.25,16.90,17.40
|
||||
0.35233,0.00,21.890,0,0.6240,6.4540,98.40,1.8498,4,437.0,21.20,394.08,14.59,17.10
|
||||
0.24980,0.00,21.890,0,0.6240,5.8570,98.20,1.6686,4,437.0,21.20,392.04,21.32,13.30
|
||||
0.54452,0.00,21.890,0,0.6240,6.1510,97.90,1.6687,4,437.0,21.20,396.90,18.46,17.80
|
||||
0.29090,0.00,21.890,0,0.6240,6.1740,93.60,1.6119,4,437.0,21.20,388.08,24.16,14.00
|
||||
1.62864,0.00,21.890,0,0.6240,5.0190,100.00,1.4394,4,437.0,21.20,396.90,34.41,14.40
|
||||
3.32105,0.00,19.580,1,0.8710,5.4030,100.00,1.3216,5,403.0,14.70,396.90,26.82,13.40
|
||||
4.09740,0.00,19.580,0,0.8710,5.4680,100.00,1.4118,5,403.0,14.70,396.90,26.42,15.60
|
||||
2.77974,0.00,19.580,0,0.8710,4.9030,97.80,1.3459,5,403.0,14.70,396.90,29.29,11.80
|
||||
2.37934,0.00,19.580,0,0.8710,6.1300,100.00,1.4191,5,403.0,14.70,172.91,27.80,13.80
|
||||
2.15505,0.00,19.580,0,0.8710,5.6280,100.00,1.5166,5,403.0,14.70,169.27,16.65,15.60
|
||||
2.36862,0.00,19.580,0,0.8710,4.9260,95.70,1.4608,5,403.0,14.70,391.71,29.53,14.60
|
||||
2.33099,0.00,19.580,0,0.8710,5.1860,93.80,1.5296,5,403.0,14.70,356.99,28.32,17.80
|
||||
2.73397,0.00,19.580,0,0.8710,5.5970,94.90,1.5257,5,403.0,14.70,351.85,21.45,15.40
|
||||
1.65660,0.00,19.580,0,0.8710,6.1220,97.30,1.6180,5,403.0,14.70,372.80,14.10,21.50
|
||||
1.49632,0.00,19.580,0,0.8710,5.4040,100.00,1.5916,5,403.0,14.70,341.60,13.28,19.60
|
||||
1.12658,0.00,19.580,1,0.8710,5.0120,88.00,1.6102,5,403.0,14.70,343.28,12.12,15.30
|
||||
2.14918,0.00,19.580,0,0.8710,5.7090,98.50,1.6232,5,403.0,14.70,261.95,15.79,19.40
|
||||
1.41385,0.00,19.580,1,0.8710,6.1290,96.00,1.7494,5,403.0,14.70,321.02,15.12,17.00
|
||||
3.53501,0.00,19.580,1,0.8710,6.1520,82.60,1.7455,5,403.0,14.70,88.01,15.02,15.60
|
||||
2.44668,0.00,19.580,0,0.8710,5.2720,94.00,1.7364,5,403.0,14.70,88.63,16.14,13.10
|
||||
1.22358,0.00,19.580,0,0.6050,6.9430,97.40,1.8773,5,403.0,14.70,363.43,4.59,41.30
|
||||
1.34284,0.00,19.580,0,0.6050,6.0660,100.00,1.7573,5,403.0,14.70,353.89,6.43,24.30
|
||||
1.42502,0.00,19.580,0,0.8710,6.5100,100.00,1.7659,5,403.0,14.70,364.31,7.39,23.30
|
||||
1.27346,0.00,19.580,1,0.6050,6.2500,92.60,1.7984,5,403.0,14.70,338.92,5.50,27.00
|
||||
1.46336,0.00,19.580,0,0.6050,7.4890,90.80,1.9709,5,403.0,14.70,374.43,1.73,50.00
|
||||
1.83377,0.00,19.580,1,0.6050,7.8020,98.20,2.0407,5,403.0,14.70,389.61,1.92,50.00
|
||||
1.51902,0.00,19.580,1,0.6050,8.3750,93.90,2.1620,5,403.0,14.70,388.45,3.32,50.00
|
||||
2.24236,0.00,19.580,0,0.6050,5.8540,91.80,2.4220,5,403.0,14.70,395.11,11.64,22.70
|
||||
2.92400,0.00,19.580,0,0.6050,6.1010,93.00,2.2834,5,403.0,14.70,240.16,9.81,25.00
|
||||
2.01019,0.00,19.580,0,0.6050,7.9290,96.20,2.0459,5,403.0,14.70,369.30,3.70,50.00
|
||||
1.80028,0.00,19.580,0,0.6050,5.8770,79.20,2.4259,5,403.0,14.70,227.61,12.14,23.80
|
||||
2.30040,0.00,19.580,0,0.6050,6.3190,96.10,2.1000,5,403.0,14.70,297.09,11.10,23.80
|
||||
2.44953,0.00,19.580,0,0.6050,6.4020,95.20,2.2625,5,403.0,14.70,330.04,11.32,22.30
|
||||
1.20742,0.00,19.580,0,0.6050,5.8750,94.60,2.4259,5,403.0,14.70,292.29,14.43,17.40
|
||||
2.31390,0.00,19.580,0,0.6050,5.8800,97.30,2.3887,5,403.0,14.70,348.13,12.03,19.10
|
||||
0.13914,0.00,4.050,0,0.5100,5.5720,88.50,2.5961,5,296.0,16.60,396.90,14.69,23.10
|
||||
0.09178,0.00,4.050,0,0.5100,6.4160,84.10,2.6463,5,296.0,16.60,395.50,9.04,23.60
|
||||
0.08447,0.00,4.050,0,0.5100,5.8590,68.70,2.7019,5,296.0,16.60,393.23,9.64,22.60
|
||||
0.06664,0.00,4.050,0,0.5100,6.5460,33.10,3.1323,5,296.0,16.60,390.96,5.33,29.40
|
||||
0.07022,0.00,4.050,0,0.5100,6.0200,47.20,3.5549,5,296.0,16.60,393.23,10.11,23.20
|
||||
0.05425,0.00,4.050,0,0.5100,6.3150,73.40,3.3175,5,296.0,16.60,395.60,6.29,24.60
|
||||
0.06642,0.00,4.050,0,0.5100,6.8600,74.40,2.9153,5,296.0,16.60,391.27,6.92,29.90
|
||||
0.05780,0.00,2.460,0,0.4880,6.9800,58.40,2.8290,3,193.0,17.80,396.90,5.04,37.20
|
||||
0.06588,0.00,2.460,0,0.4880,7.7650,83.30,2.7410,3,193.0,17.80,395.56,7.56,39.80
|
||||
0.06888,0.00,2.460,0,0.4880,6.1440,62.20,2.5979,3,193.0,17.80,396.90,9.45,36.20
|
||||
0.09103,0.00,2.460,0,0.4880,7.1550,92.20,2.7006,3,193.0,17.80,394.12,4.82,37.90
|
||||
0.10008,0.00,2.460,0,0.4880,6.5630,95.60,2.8470,3,193.0,17.80,396.90,5.68,32.50
|
||||
0.08308,0.00,2.460,0,0.4880,5.6040,89.80,2.9879,3,193.0,17.80,391.00,13.98,26.40
|
||||
0.06047,0.00,2.460,0,0.4880,6.1530,68.80,3.2797,3,193.0,17.80,387.11,13.15,29.60
|
||||
0.05602,0.00,2.460,0,0.4880,7.8310,53.60,3.1992,3,193.0,17.80,392.63,4.45,50.00
|
||||
0.07875,45.00,3.440,0,0.4370,6.7820,41.10,3.7886,5,398.0,15.20,393.87,6.68,32.00
|
||||
0.12579,45.00,3.440,0,0.4370,6.5560,29.10,4.5667,5,398.0,15.20,382.84,4.56,29.80
|
||||
0.08370,45.00,3.440,0,0.4370,7.1850,38.90,4.5667,5,398.0,15.20,396.90,5.39,34.90
|
||||
0.09068,45.00,3.440,0,0.4370,6.9510,21.50,6.4798,5,398.0,15.20,377.68,5.10,37.00
|
||||
0.06911,45.00,3.440,0,0.4370,6.7390,30.80,6.4798,5,398.0,15.20,389.71,4.69,30.50
|
||||
0.08664,45.00,3.440,0,0.4370,7.1780,26.30,6.4798,5,398.0,15.20,390.49,2.87,36.40
|
||||
0.02187,60.00,2.930,0,0.4010,6.8000,9.90,6.2196,1,265.0,15.60,393.37,5.03,31.10
|
||||
0.01439,60.00,2.930,0,0.4010,6.6040,18.80,6.2196,1,265.0,15.60,376.70,4.38,29.10
|
||||
0.01381,80.00,0.460,0,0.4220,7.8750,32.00,5.6484,4,255.0,14.40,394.23,2.97,50.00
|
||||
0.04011,80.00,1.520,0,0.4040,7.2870,34.10,7.3090,2,329.0,12.60,396.90,4.08,33.30
|
||||
0.04666,80.00,1.520,0,0.4040,7.1070,36.60,7.3090,2,329.0,12.60,354.31,8.61,30.30
|
||||
0.03768,80.00,1.520,0,0.4040,7.2740,38.30,7.3090,2,329.0,12.60,392.20,6.62,34.60
|
||||
0.03150,95.00,1.470,0,0.4030,6.9750,15.30,7.6534,3,402.0,17.00,396.90,4.56,34.90
|
||||
0.01778,95.00,1.470,0,0.4030,7.1350,13.90,7.6534,3,402.0,17.00,384.30,4.45,32.90
|
||||
0.03445,82.50,2.030,0,0.4150,6.1620,38.40,6.2700,2,348.0,14.70,393.77,7.43,24.10
|
||||
0.02177,82.50,2.030,0,0.4150,7.6100,15.70,6.2700,2,348.0,14.70,395.38,3.11,42.30
|
||||
0.03510,95.00,2.680,0,0.4161,7.8530,33.20,5.1180,4,224.0,14.70,392.78,3.81,48.50
|
||||
0.02009,95.00,2.680,0,0.4161,8.0340,31.90,5.1180,4,224.0,14.70,390.55,2.88,50.00
|
||||
0.13642,0.00,10.590,0,0.4890,5.8910,22.30,3.9454,4,277.0,18.60,396.90,10.87,22.60
|
||||
0.22969,0.00,10.590,0,0.4890,6.3260,52.50,4.3549,4,277.0,18.60,394.87,10.97,24.40
|
||||
0.25199,0.00,10.590,0,0.4890,5.7830,72.70,4.3549,4,277.0,18.60,389.43,18.06,22.50
|
||||
0.13587,0.00,10.590,1,0.4890,6.0640,59.10,4.2392,4,277.0,18.60,381.32,14.66,24.40
|
||||
0.43571,0.00,10.590,1,0.4890,5.3440,100.00,3.8750,4,277.0,18.60,396.90,23.09,20.00
|
||||
0.17446,0.00,10.590,1,0.4890,5.9600,92.10,3.8771,4,277.0,18.60,393.25,17.27,21.70
|
||||
0.37578,0.00,10.590,1,0.4890,5.4040,88.60,3.6650,4,277.0,18.60,395.24,23.98,19.30
|
||||
0.21719,0.00,10.590,1,0.4890,5.8070,53.80,3.6526,4,277.0,18.60,390.94,16.03,22.40
|
||||
0.14052,0.00,10.590,0,0.4890,6.3750,32.30,3.9454,4,277.0,18.60,385.81,9.38,28.10
|
||||
0.28955,0.00,10.590,0,0.4890,5.4120,9.80,3.5875,4,277.0,18.60,348.93,29.55,23.70
|
||||
0.19802,0.00,10.590,0,0.4890,6.1820,42.40,3.9454,4,277.0,18.60,393.63,9.47,25.00
|
||||
0.04560,0.00,13.890,1,0.5500,5.8880,56.00,3.1121,5,276.0,16.40,392.80,13.51,23.30
|
||||
0.07013,0.00,13.890,0,0.5500,6.6420,85.10,3.4211,5,276.0,16.40,392.78,9.69,28.70
|
||||
0.11069,0.00,13.890,1,0.5500,5.9510,93.80,2.8893,5,276.0,16.40,396.90,17.92,21.50
|
||||
0.11425,0.00,13.890,1,0.5500,6.3730,92.40,3.3633,5,276.0,16.40,393.74,10.50,23.00
|
||||
0.35809,0.00,6.200,1,0.5070,6.9510,88.50,2.8617,8,307.0,17.40,391.70,9.71,26.70
|
||||
0.40771,0.00,6.200,1,0.5070,6.1640,91.30,3.0480,8,307.0,17.40,395.24,21.46,21.70
|
||||
0.62356,0.00,6.200,1,0.5070,6.8790,77.70,3.2721,8,307.0,17.40,390.39,9.93,27.50
|
||||
0.61470,0.00,6.200,0,0.5070,6.6180,80.80,3.2721,8,307.0,17.40,396.90,7.60,30.10
|
||||
0.31533,0.00,6.200,0,0.5040,8.2660,78.30,2.8944,8,307.0,17.40,385.05,4.14,44.80
|
||||
0.52693,0.00,6.200,0,0.5040,8.7250,83.00,2.8944,8,307.0,17.40,382.00,4.63,50.00
|
||||
0.38214,0.00,6.200,0,0.5040,8.0400,86.50,3.2157,8,307.0,17.40,387.38,3.13,37.60
|
||||
0.41238,0.00,6.200,0,0.5040,7.1630,79.90,3.2157,8,307.0,17.40,372.08,6.36,31.60
|
||||
0.29819,0.00,6.200,0,0.5040,7.6860,17.00,3.3751,8,307.0,17.40,377.51,3.92,46.70
|
||||
0.44178,0.00,6.200,0,0.5040,6.5520,21.40,3.3751,8,307.0,17.40,380.34,3.76,31.50
|
||||
0.53700,0.00,6.200,0,0.5040,5.9810,68.10,3.6715,8,307.0,17.40,378.35,11.65,24.30
|
||||
0.46296,0.00,6.200,0,0.5040,7.4120,76.90,3.6715,8,307.0,17.40,376.14,5.25,31.70
|
||||
0.57529,0.00,6.200,0,0.5070,8.3370,73.30,3.8384,8,307.0,17.40,385.91,2.47,41.70
|
||||
0.33147,0.00,6.200,0,0.5070,8.2470,70.40,3.6519,8,307.0,17.40,378.95,3.95,48.30
|
||||
0.44791,0.00,6.200,1,0.5070,6.7260,66.50,3.6519,8,307.0,17.40,360.20,8.05,29.00
|
||||
0.33045,0.00,6.200,0,0.5070,6.0860,61.50,3.6519,8,307.0,17.40,376.75,10.88,24.00
|
||||
0.52058,0.00,6.200,1,0.5070,6.6310,76.50,4.1480,8,307.0,17.40,388.45,9.54,25.10
|
||||
0.51183,0.00,6.200,0,0.5070,7.3580,71.60,4.1480,8,307.0,17.40,390.07,4.73,31.50
|
||||
0.08244,30.00,4.930,0,0.4280,6.4810,18.50,6.1899,6,300.0,16.60,379.41,6.36,23.70
|
||||
0.09252,30.00,4.930,0,0.4280,6.6060,42.20,6.1899,6,300.0,16.60,383.78,7.37,23.30
|
||||
0.11329,30.00,4.930,0,0.4280,6.8970,54.30,6.3361,6,300.0,16.60,391.25,11.38,22.00
|
||||
0.10612,30.00,4.930,0,0.4280,6.0950,65.10,6.3361,6,300.0,16.60,394.62,12.40,20.10
|
||||
0.10290,30.00,4.930,0,0.4280,6.3580,52.90,7.0355,6,300.0,16.60,372.75,11.22,22.20
|
||||
0.12757,30.00,4.930,0,0.4280,6.3930,7.80,7.0355,6,300.0,16.60,374.71,5.19,23.70
|
||||
0.20608,22.00,5.860,0,0.4310,5.5930,76.50,7.9549,7,330.0,19.10,372.49,12.50,17.60
|
||||
0.19133,22.00,5.860,0,0.4310,5.6050,70.20,7.9549,7,330.0,19.10,389.13,18.46,18.50
|
||||
0.33983,22.00,5.860,0,0.4310,6.1080,34.90,8.0555,7,330.0,19.10,390.18,9.16,24.30
|
||||
0.19657,22.00,5.860,0,0.4310,6.2260,79.20,8.0555,7,330.0,19.10,376.14,10.15,20.50
|
||||
0.16439,22.00,5.860,0,0.4310,6.4330,49.10,7.8265,7,330.0,19.10,374.71,9.52,24.50
|
||||
0.19073,22.00,5.860,0,0.4310,6.7180,17.50,7.8265,7,330.0,19.10,393.74,6.56,26.20
|
||||
0.14030,22.00,5.860,0,0.4310,6.4870,13.00,7.3967,7,330.0,19.10,396.28,5.90,24.40
|
||||
0.21409,22.00,5.860,0,0.4310,6.4380,8.90,7.3967,7,330.0,19.10,377.07,3.59,24.80
|
||||
0.08221,22.00,5.860,0,0.4310,6.9570,6.80,8.9067,7,330.0,19.10,386.09,3.53,29.60
|
||||
0.36894,22.00,5.860,0,0.4310,8.2590,8.40,8.9067,7,330.0,19.10,396.90,3.54,42.80
|
||||
0.04819,80.00,3.640,0,0.3920,6.1080,32.00,9.2203,1,315.0,16.40,392.89,6.57,21.90
|
||||
0.03548,80.00,3.640,0,0.3920,5.8760,19.10,9.2203,1,315.0,16.40,395.18,9.25,20.90
|
||||
0.01538,90.00,3.750,0,0.3940,7.4540,34.20,6.3361,3,244.0,15.90,386.34,3.11,44.00
|
||||
0.61154,20.00,3.970,0,0.6470,8.7040,86.90,1.8010,5,264.0,13.00,389.70,5.12,50.00
|
||||
0.66351,20.00,3.970,0,0.6470,7.3330,100.00,1.8946,5,264.0,13.00,383.29,7.79,36.00
|
||||
0.65665,20.00,3.970,0,0.6470,6.8420,100.00,2.0107,5,264.0,13.00,391.93,6.90,30.10
|
||||
0.54011,20.00,3.970,0,0.6470,7.2030,81.80,2.1121,5,264.0,13.00,392.80,9.59,33.80
|
||||
0.53412,20.00,3.970,0,0.6470,7.5200,89.40,2.1398,5,264.0,13.00,388.37,7.26,43.10
|
||||
0.52014,20.00,3.970,0,0.6470,8.3980,91.50,2.2885,5,264.0,13.00,386.86,5.91,48.80
|
||||
0.82526,20.00,3.970,0,0.6470,7.3270,94.50,2.0788,5,264.0,13.00,393.42,11.25,31.00
|
||||
0.55007,20.00,3.970,0,0.6470,7.2060,91.60,1.9301,5,264.0,13.00,387.89,8.10,36.50
|
||||
0.76162,20.00,3.970,0,0.6470,5.5600,62.80,1.9865,5,264.0,13.00,392.40,10.45,22.80
|
||||
0.78570,20.00,3.970,0,0.6470,7.0140,84.60,2.1329,5,264.0,13.00,384.07,14.79,30.70
|
||||
0.57834,20.00,3.970,0,0.5750,8.2970,67.00,2.4216,5,264.0,13.00,384.54,7.44,50.00
|
||||
0.54050,20.00,3.970,0,0.5750,7.4700,52.60,2.8720,5,264.0,13.00,390.30,3.16,43.50
|
||||
0.09065,20.00,6.960,1,0.4640,5.9200,61.50,3.9175,3,223.0,18.60,391.34,13.65,20.70
|
||||
0.29916,20.00,6.960,0,0.4640,5.8560,42.10,4.4290,3,223.0,18.60,388.65,13.00,21.10
|
||||
0.16211,20.00,6.960,0,0.4640,6.2400,16.30,4.4290,3,223.0,18.60,396.90,6.59,25.20
|
||||
0.11460,20.00,6.960,0,0.4640,6.5380,58.70,3.9175,3,223.0,18.60,394.96,7.73,24.40
|
||||
0.22188,20.00,6.960,1,0.4640,7.6910,51.80,4.3665,3,223.0,18.60,390.77,6.58,35.20
|
||||
0.05644,40.00,6.410,1,0.4470,6.7580,32.90,4.0776,4,254.0,17.60,396.90,3.53,32.40
|
||||
0.09604,40.00,6.410,0,0.4470,6.8540,42.80,4.2673,4,254.0,17.60,396.90,2.98,32.00
|
||||
0.10469,40.00,6.410,1,0.4470,7.2670,49.00,4.7872,4,254.0,17.60,389.25,6.05,33.20
|
||||
0.06127,40.00,6.410,1,0.4470,6.8260,27.60,4.8628,4,254.0,17.60,393.45,4.16,33.10
|
||||
0.07978,40.00,6.410,0,0.4470,6.4820,32.10,4.1403,4,254.0,17.60,396.90,7.19,29.10
|
||||
0.21038,20.00,3.330,0,0.4429,6.8120,32.20,4.1007,5,216.0,14.90,396.90,4.85,35.10
|
||||
0.03578,20.00,3.330,0,0.4429,7.8200,64.50,4.6947,5,216.0,14.90,387.31,3.76,45.40
|
||||
0.03705,20.00,3.330,0,0.4429,6.9680,37.20,5.2447,5,216.0,14.90,392.23,4.59,35.40
|
||||
0.06129,20.00,3.330,1,0.4429,7.6450,49.70,5.2119,5,216.0,14.90,377.07,3.01,46.00
|
||||
0.01501,90.00,1.210,1,0.4010,7.9230,24.80,5.8850,1,198.0,13.60,395.52,3.16,50.00
|
||||
0.00906,90.00,2.970,0,0.4000,7.0880,20.80,7.3073,1,285.0,15.30,394.72,7.85,32.20
|
||||
0.01096,55.00,2.250,0,0.3890,6.4530,31.90,7.3073,1,300.0,15.30,394.72,8.23,22.00
|
||||
0.01965,80.00,1.760,0,0.3850,6.2300,31.50,9.0892,1,241.0,18.20,341.60,12.93,20.10
|
||||
0.03871,52.50,5.320,0,0.4050,6.2090,31.30,7.3172,6,293.0,16.60,396.90,7.14,23.20
|
||||
0.04590,52.50,5.320,0,0.4050,6.3150,45.60,7.3172,6,293.0,16.60,396.90,7.60,22.30
|
||||
0.04297,52.50,5.320,0,0.4050,6.5650,22.90,7.3172,6,293.0,16.60,371.72,9.51,24.80
|
||||
0.03502,80.00,4.950,0,0.4110,6.8610,27.90,5.1167,4,245.0,19.20,396.90,3.33,28.50
|
||||
0.07886,80.00,4.950,0,0.4110,7.1480,27.70,5.1167,4,245.0,19.20,396.90,3.56,37.30
|
||||
0.03615,80.00,4.950,0,0.4110,6.6300,23.40,5.1167,4,245.0,19.20,396.90,4.70,27.90
|
||||
0.08265,0.00,13.920,0,0.4370,6.1270,18.40,5.5027,4,289.0,16.00,396.90,8.58,23.90
|
||||
0.08199,0.00,13.920,0,0.4370,6.0090,42.30,5.5027,4,289.0,16.00,396.90,10.40,21.70
|
||||
0.12932,0.00,13.920,0,0.4370,6.6780,31.10,5.9604,4,289.0,16.00,396.90,6.27,28.60
|
||||
0.05372,0.00,13.920,0,0.4370,6.5490,51.00,5.9604,4,289.0,16.00,392.85,7.39,27.10
|
||||
0.14103,0.00,13.920,0,0.4370,5.7900,58.00,6.3200,4,289.0,16.00,396.90,15.84,20.30
|
||||
0.06466,70.00,2.240,0,0.4000,6.3450,20.10,7.8278,5,358.0,14.80,368.24,4.97,22.50
|
||||
0.05561,70.00,2.240,0,0.4000,7.0410,10.00,7.8278,5,358.0,14.80,371.58,4.74,29.00
|
||||
0.04417,70.00,2.240,0,0.4000,6.8710,47.40,7.8278,5,358.0,14.80,390.86,6.07,24.80
|
||||
0.03537,34.00,6.090,0,0.4330,6.5900,40.40,5.4917,7,329.0,16.10,395.75,9.50,22.00
|
||||
0.09266,34.00,6.090,0,0.4330,6.4950,18.40,5.4917,7,329.0,16.10,383.61,8.67,26.40
|
||||
0.10000,34.00,6.090,0,0.4330,6.9820,17.70,5.4917,7,329.0,16.10,390.43,4.86,33.10
|
||||
0.05515,33.00,2.180,0,0.4720,7.2360,41.10,4.0220,7,222.0,18.40,393.68,6.93,36.10
|
||||
0.05479,33.00,2.180,0,0.4720,6.6160,58.10,3.3700,7,222.0,18.40,393.36,8.93,28.40
|
||||
0.07503,33.00,2.180,0,0.4720,7.4200,71.90,3.0992,7,222.0,18.40,396.90,6.47,33.40
|
||||
0.04932,33.00,2.180,0,0.4720,6.8490,70.30,3.1827,7,222.0,18.40,396.90,7.53,28.20
|
||||
0.49298,0.00,9.900,0,0.5440,6.6350,82.50,3.3175,4,304.0,18.40,396.90,4.54,22.80
|
||||
0.34940,0.00,9.900,0,0.5440,5.9720,76.70,3.1025,4,304.0,18.40,396.24,9.97,20.30
|
||||
2.63548,0.00,9.900,0,0.5440,4.9730,37.80,2.5194,4,304.0,18.40,350.45,12.64,16.10
|
||||
0.79041,0.00,9.900,0,0.5440,6.1220,52.80,2.6403,4,304.0,18.40,396.90,5.98,22.10
|
||||
0.26169,0.00,9.900,0,0.5440,6.0230,90.40,2.8340,4,304.0,18.40,396.30,11.72,19.40
|
||||
0.26938,0.00,9.900,0,0.5440,6.2660,82.80,3.2628,4,304.0,18.40,393.39,7.90,21.60
|
||||
0.36920,0.00,9.900,0,0.5440,6.5670,87.30,3.6023,4,304.0,18.40,395.69,9.28,23.80
|
||||
0.25356,0.00,9.900,0,0.5440,5.7050,77.70,3.9450,4,304.0,18.40,396.42,11.50,16.20
|
||||
0.31827,0.00,9.900,0,0.5440,5.9140,83.20,3.9986,4,304.0,18.40,390.70,18.33,17.80
|
||||
0.24522,0.00,9.900,0,0.5440,5.7820,71.70,4.0317,4,304.0,18.40,396.90,15.94,19.80
|
||||
0.40202,0.00,9.900,0,0.5440,6.3820,67.20,3.5325,4,304.0,18.40,395.21,10.36,23.10
|
||||
0.47547,0.00,9.900,0,0.5440,6.1130,58.80,4.0019,4,304.0,18.40,396.23,12.73,21.00
|
||||
0.16760,0.00,7.380,0,0.4930,6.4260,52.30,4.5404,5,287.0,19.60,396.90,7.20,23.80
|
||||
0.18159,0.00,7.380,0,0.4930,6.3760,54.30,4.5404,5,287.0,19.60,396.90,6.87,23.10
|
||||
0.35114,0.00,7.380,0,0.4930,6.0410,49.90,4.7211,5,287.0,19.60,396.90,7.70,20.40
|
||||
0.28392,0.00,7.380,0,0.4930,5.7080,74.30,4.7211,5,287.0,19.60,391.13,11.74,18.50
|
||||
0.34109,0.00,7.380,0,0.4930,6.4150,40.10,4.7211,5,287.0,19.60,396.90,6.12,25.00
|
||||
0.19186,0.00,7.380,0,0.4930,6.4310,14.70,5.4159,5,287.0,19.60,393.68,5.08,24.60
|
||||
0.30347,0.00,7.380,0,0.4930,6.3120,28.90,5.4159,5,287.0,19.60,396.90,6.15,23.00
|
||||
0.24103,0.00,7.380,0,0.4930,6.0830,43.70,5.4159,5,287.0,19.60,396.90,12.79,22.20
|
||||
0.06617,0.00,3.240,0,0.4600,5.8680,25.80,5.2146,4,430.0,16.90,382.44,9.97,19.30
|
||||
0.06724,0.00,3.240,0,0.4600,6.3330,17.20,5.2146,4,430.0,16.90,375.21,7.34,22.60
|
||||
0.04544,0.00,3.240,0,0.4600,6.1440,32.20,5.8736,4,430.0,16.90,368.57,9.09,19.80
|
||||
0.05023,35.00,6.060,0,0.4379,5.7060,28.40,6.6407,1,304.0,16.90,394.02,12.43,17.10
|
||||
0.03466,35.00,6.060,0,0.4379,6.0310,23.30,6.6407,1,304.0,16.90,362.25,7.83,19.40
|
||||
0.05083,0.00,5.190,0,0.5150,6.3160,38.10,6.4584,5,224.0,20.20,389.71,5.68,22.20
|
||||
0.03738,0.00,5.190,0,0.5150,6.3100,38.50,6.4584,5,224.0,20.20,389.40,6.75,20.70
|
||||
0.03961,0.00,5.190,0,0.5150,6.0370,34.50,5.9853,5,224.0,20.20,396.90,8.01,21.10
|
||||
0.03427,0.00,5.190,0,0.5150,5.8690,46.30,5.2311,5,224.0,20.20,396.90,9.80,19.50
|
||||
0.03041,0.00,5.190,0,0.5150,5.8950,59.60,5.6150,5,224.0,20.20,394.81,10.56,18.50
|
||||
0.03306,0.00,5.190,0,0.5150,6.0590,37.30,4.8122,5,224.0,20.20,396.14,8.51,20.60
|
||||
0.05497,0.00,5.190,0,0.5150,5.9850,45.40,4.8122,5,224.0,20.20,396.90,9.74,19.00
|
||||
0.06151,0.00,5.190,0,0.5150,5.9680,58.50,4.8122,5,224.0,20.20,396.90,9.29,18.70
|
||||
0.01301,35.00,1.520,0,0.4420,7.2410,49.30,7.0379,1,284.0,15.50,394.74,5.49,32.70
|
||||
0.02498,0.00,1.890,0,0.5180,6.5400,59.70,6.2669,1,422.0,15.90,389.96,8.65,16.50
|
||||
0.02543,55.00,3.780,0,0.4840,6.6960,56.40,5.7321,5,370.0,17.60,396.90,7.18,23.90
|
||||
0.03049,55.00,3.780,0,0.4840,6.8740,28.10,6.4654,5,370.0,17.60,387.97,4.61,31.20
|
||||
0.03113,0.00,4.390,0,0.4420,6.0140,48.50,8.0136,3,352.0,18.80,385.64,10.53,17.50
|
||||
0.06162,0.00,4.390,0,0.4420,5.8980,52.30,8.0136,3,352.0,18.80,364.61,12.67,17.20
|
||||
0.01870,85.00,4.150,0,0.4290,6.5160,27.70,8.5353,4,351.0,17.90,392.43,6.36,23.10
|
||||
0.01501,80.00,2.010,0,0.4350,6.6350,29.70,8.3440,4,280.0,17.00,390.94,5.99,24.50
|
||||
0.02899,40.00,1.250,0,0.4290,6.9390,34.50,8.7921,1,335.0,19.70,389.85,5.89,26.60
|
||||
0.06211,40.00,1.250,0,0.4290,6.4900,44.40,8.7921,1,335.0,19.70,396.90,5.98,22.90
|
||||
0.07950,60.00,1.690,0,0.4110,6.5790,35.90,10.7103,4,411.0,18.30,370.78,5.49,24.10
|
||||
0.07244,60.00,1.690,0,0.4110,5.8840,18.50,10.7103,4,411.0,18.30,392.33,7.79,18.60
|
||||
0.01709,90.00,2.020,0,0.4100,6.7280,36.10,12.1265,5,187.0,17.00,384.46,4.50,30.10
|
||||
0.04301,80.00,1.910,0,0.4130,5.6630,21.90,10.5857,4,334.0,22.00,382.80,8.05,18.20
|
||||
0.10659,80.00,1.910,0,0.4130,5.9360,19.50,10.5857,4,334.0,22.00,376.04,5.57,20.60
|
||||
8.98296,0.00,18.100,1,0.7700,6.2120,97.40,2.1222,24,666.0,20.20,377.73,17.60,17.80
|
||||
3.84970,0.00,18.100,1,0.7700,6.3950,91.00,2.5052,24,666.0,20.20,391.34,13.27,21.70
|
||||
5.20177,0.00,18.100,1,0.7700,6.1270,83.40,2.7227,24,666.0,20.20,395.43,11.48,22.70
|
||||
4.26131,0.00,18.100,0,0.7700,6.1120,81.30,2.5091,24,666.0,20.20,390.74,12.67,22.60
|
||||
4.54192,0.00,18.100,0,0.7700,6.3980,88.00,2.5182,24,666.0,20.20,374.56,7.79,25.00
|
||||
3.83684,0.00,18.100,0,0.7700,6.2510,91.10,2.2955,24,666.0,20.20,350.65,14.19,19.90
|
||||
3.67822,0.00,18.100,0,0.7700,5.3620,96.20,2.1036,24,666.0,20.20,380.79,10.19,20.80
|
||||
4.22239,0.00,18.100,1,0.7700,5.8030,89.00,1.9047,24,666.0,20.20,353.04,14.64,16.80
|
||||
3.47428,0.00,18.100,1,0.7180,8.7800,82.90,1.9047,24,666.0,20.20,354.55,5.29,21.90
|
||||
4.55587,0.00,18.100,0,0.7180,3.5610,87.90,1.6132,24,666.0,20.20,354.70,7.12,27.50
|
||||
3.69695,0.00,18.100,0,0.7180,4.9630,91.40,1.7523,24,666.0,20.20,316.03,14.00,21.90
|
||||
13.52220,0.00,18.100,0,0.6310,3.8630,100.00,1.5106,24,666.0,20.20,131.42,13.33,23.10
|
||||
4.89822,0.00,18.100,0,0.6310,4.9700,100.00,1.3325,24,666.0,20.20,375.52,3.26,50.00
|
||||
5.66998,0.00,18.100,1,0.6310,6.6830,96.80,1.3567,24,666.0,20.20,375.33,3.73,50.00
|
||||
6.53876,0.00,18.100,1,0.6310,7.0160,97.50,1.2024,24,666.0,20.20,392.05,2.96,50.00
|
||||
9.23230,0.00,18.100,0,0.6310,6.2160,100.00,1.1691,24,666.0,20.20,366.15,9.53,50.00
|
||||
8.26725,0.00,18.100,1,0.6680,5.8750,89.60,1.1296,24,666.0,20.20,347.88,8.88,50.00
|
||||
11.10810,0.00,18.100,0,0.6680,4.9060,100.00,1.1742,24,666.0,20.20,396.90,34.77,13.80
|
||||
18.49820,0.00,18.100,0,0.6680,4.1380,100.00,1.1370,24,666.0,20.20,396.90,37.97,13.80
|
||||
19.60910,0.00,18.100,0,0.6710,7.3130,97.90,1.3163,24,666.0,20.20,396.90,13.44,15.00
|
||||
15.28800,0.00,18.100,0,0.6710,6.6490,93.30,1.3449,24,666.0,20.20,363.02,23.24,13.90
|
||||
9.82349,0.00,18.100,0,0.6710,6.7940,98.80,1.3580,24,666.0,20.20,396.90,21.24,13.30
|
||||
23.64820,0.00,18.100,0,0.6710,6.3800,96.20,1.3861,24,666.0,20.20,396.90,23.69,13.10
|
||||
17.86670,0.00,18.100,0,0.6710,6.2230,100.00,1.3861,24,666.0,20.20,393.74,21.78,10.20
|
||||
88.97620,0.00,18.100,0,0.6710,6.9680,91.90,1.4165,24,666.0,20.20,396.90,17.21,10.40
|
||||
15.87440,0.00,18.100,0,0.6710,6.5450,99.10,1.5192,24,666.0,20.20,396.90,21.08,10.90
|
||||
9.18702,0.00,18.100,0,0.7000,5.5360,100.00,1.5804,24,666.0,20.20,396.90,23.60,11.30
|
||||
7.99248,0.00,18.100,0,0.7000,5.5200,100.00,1.5331,24,666.0,20.20,396.90,24.56,12.30
|
||||
20.08490,0.00,18.100,0,0.7000,4.3680,91.20,1.4395,24,666.0,20.20,285.83,30.63,8.80
|
||||
16.81180,0.00,18.100,0,0.7000,5.2770,98.10,1.4261,24,666.0,20.20,396.90,30.81,7.20
|
||||
24.39380,0.00,18.100,0,0.7000,4.6520,100.00,1.4672,24,666.0,20.20,396.90,28.28,10.50
|
||||
22.59710,0.00,18.100,0,0.7000,5.0000,89.50,1.5184,24,666.0,20.20,396.90,31.99,7.40
|
||||
14.33370,0.00,18.100,0,0.7000,4.8800,100.00,1.5895,24,666.0,20.20,372.92,30.62,10.20
|
||||
8.15174,0.00,18.100,0,0.7000,5.3900,98.90,1.7281,24,666.0,20.20,396.90,20.85,11.50
|
||||
6.96215,0.00,18.100,0,0.7000,5.7130,97.00,1.9265,24,666.0,20.20,394.43,17.11,15.10
|
||||
5.29305,0.00,18.100,0,0.7000,6.0510,82.50,2.1678,24,666.0,20.20,378.38,18.76,23.20
|
||||
11.57790,0.00,18.100,0,0.7000,5.0360,97.00,1.7700,24,666.0,20.20,396.90,25.68,9.70
|
||||
8.64476,0.00,18.100,0,0.6930,6.1930,92.60,1.7912,24,666.0,20.20,396.90,15.17,13.80
|
||||
13.35980,0.00,18.100,0,0.6930,5.8870,94.70,1.7821,24,666.0,20.20,396.90,16.35,12.70
|
||||
8.71675,0.00,18.100,0,0.6930,6.4710,98.80,1.7257,24,666.0,20.20,391.98,17.12,13.10
|
||||
5.87205,0.00,18.100,0,0.6930,6.4050,96.00,1.6768,24,666.0,20.20,396.90,19.37,12.50
|
||||
7.67202,0.00,18.100,0,0.6930,5.7470,98.90,1.6334,24,666.0,20.20,393.10,19.92,8.50
|
||||
38.35180,0.00,18.100,0,0.6930,5.4530,100.00,1.4896,24,666.0,20.20,396.90,30.59,5.00
|
||||
9.91655,0.00,18.100,0,0.6930,5.8520,77.80,1.5004,24,666.0,20.20,338.16,29.97,6.30
|
||||
25.04610,0.00,18.100,0,0.6930,5.9870,100.00,1.5888,24,666.0,20.20,396.90,26.77,5.60
|
||||
14.23620,0.00,18.100,0,0.6930,6.3430,100.00,1.5741,24,666.0,20.20,396.90,20.32,7.20
|
||||
9.59571,0.00,18.100,0,0.6930,6.4040,100.00,1.6390,24,666.0,20.20,376.11,20.31,12.10
|
||||
24.80170,0.00,18.100,0,0.6930,5.3490,96.00,1.7028,24,666.0,20.20,396.90,19.77,8.30
|
||||
41.52920,0.00,18.100,0,0.6930,5.5310,85.40,1.6074,24,666.0,20.20,329.46,27.38,8.50
|
||||
67.92080,0.00,18.100,0,0.6930,5.6830,100.00,1.4254,24,666.0,20.20,384.97,22.98,5.00
|
||||
20.71620,0.00,18.100,0,0.6590,4.1380,100.00,1.1781,24,666.0,20.20,370.22,23.34,11.90
|
||||
11.95110,0.00,18.100,0,0.6590,5.6080,100.00,1.2852,24,666.0,20.20,332.09,12.13,27.90
|
||||
7.40389,0.00,18.100,0,0.5970,5.6170,97.90,1.4547,24,666.0,20.20,314.64,26.40,17.20
|
||||
14.43830,0.00,18.100,0,0.5970,6.8520,100.00,1.4655,24,666.0,20.20,179.36,19.78,27.50
|
||||
51.13580,0.00,18.100,0,0.5970,5.7570,100.00,1.4130,24,666.0,20.20,2.60,10.11,15.00
|
||||
14.05070,0.00,18.100,0,0.5970,6.6570,100.00,1.5275,24,666.0,20.20,35.05,21.22,17.20
|
||||
18.81100,0.00,18.100,0,0.5970,4.6280,100.00,1.5539,24,666.0,20.20,28.79,34.37,17.90
|
||||
28.65580,0.00,18.100,0,0.5970,5.1550,100.00,1.5894,24,666.0,20.20,210.97,20.08,16.30
|
||||
45.74610,0.00,18.100,0,0.6930,4.5190,100.00,1.6582,24,666.0,20.20,88.27,36.98,7.00
|
||||
18.08460,0.00,18.100,0,0.6790,6.4340,100.00,1.8347,24,666.0,20.20,27.25,29.05,7.20
|
||||
10.83420,0.00,18.100,0,0.6790,6.7820,90.80,1.8195,24,666.0,20.20,21.57,25.79,7.50
|
||||
25.94060,0.00,18.100,0,0.6790,5.3040,89.10,1.6475,24,666.0,20.20,127.36,26.64,10.40
|
||||
73.53410,0.00,18.100,0,0.6790,5.9570,100.00,1.8026,24,666.0,20.20,16.45,20.62,8.80
|
||||
11.81230,0.00,18.100,0,0.7180,6.8240,76.50,1.7940,24,666.0,20.20,48.45,22.74,8.40
|
||||
11.08740,0.00,18.100,0,0.7180,6.4110,100.00,1.8589,24,666.0,20.20,318.75,15.02,16.70
|
||||
7.02259,0.00,18.100,0,0.7180,6.0060,95.30,1.8746,24,666.0,20.20,319.98,15.70,14.20
|
||||
12.04820,0.00,18.100,0,0.6140,5.6480,87.60,1.9512,24,666.0,20.20,291.55,14.10,20.80
|
||||
7.05042,0.00,18.100,0,0.6140,6.1030,85.10,2.0218,24,666.0,20.20,2.52,23.29,13.40
|
||||
8.79212,0.00,18.100,0,0.5840,5.5650,70.60,2.0635,24,666.0,20.20,3.65,17.16,11.70
|
||||
15.86030,0.00,18.100,0,0.6790,5.8960,95.40,1.9096,24,666.0,20.20,7.68,24.39,8.30
|
||||
12.24720,0.00,18.100,0,0.5840,5.8370,59.70,1.9976,24,666.0,20.20,24.65,15.69,10.20
|
||||
37.66190,0.00,18.100,0,0.6790,6.2020,78.70,1.8629,24,666.0,20.20,18.82,14.52,10.90
|
||||
7.36711,0.00,18.100,0,0.6790,6.1930,78.10,1.9356,24,666.0,20.20,96.73,21.52,11.00
|
||||
9.33889,0.00,18.100,0,0.6790,6.3800,95.60,1.9682,24,666.0,20.20,60.72,24.08,9.50
|
||||
8.49213,0.00,18.100,0,0.5840,6.3480,86.10,2.0527,24,666.0,20.20,83.45,17.64,14.50
|
||||
10.06230,0.00,18.100,0,0.5840,6.8330,94.30,2.0882,24,666.0,20.20,81.33,19.69,14.10
|
||||
6.44405,0.00,18.100,0,0.5840,6.4250,74.80,2.2004,24,666.0,20.20,97.95,12.03,16.10
|
||||
5.58107,0.00,18.100,0,0.7130,6.4360,87.90,2.3158,24,666.0,20.20,100.19,16.22,14.30
|
||||
13.91340,0.00,18.100,0,0.7130,6.2080,95.00,2.2222,24,666.0,20.20,100.63,15.17,11.70
|
||||
11.16040,0.00,18.100,0,0.7400,6.6290,94.60,2.1247,24,666.0,20.20,109.85,23.27,13.40
|
||||
14.42080,0.00,18.100,0,0.7400,6.4610,93.30,2.0026,24,666.0,20.20,27.49,18.05,9.60
|
||||
15.17720,0.00,18.100,0,0.7400,6.1520,100.00,1.9142,24,666.0,20.20,9.32,26.45,8.70
|
||||
13.67810,0.00,18.100,0,0.7400,5.9350,87.90,1.8206,24,666.0,20.20,68.95,34.02,8.40
|
||||
9.39063,0.00,18.100,0,0.7400,5.6270,93.90,1.8172,24,666.0,20.20,396.90,22.88,12.80
|
||||
22.05110,0.00,18.100,0,0.7400,5.8180,92.40,1.8662,24,666.0,20.20,391.45,22.11,10.50
|
||||
9.72418,0.00,18.100,0,0.7400,6.4060,97.20,2.0651,24,666.0,20.20,385.96,19.52,17.10
|
||||
5.66637,0.00,18.100,0,0.7400,6.2190,100.00,2.0048,24,666.0,20.20,395.69,16.59,18.40
|
||||
9.96654,0.00,18.100,0,0.7400,6.4850,100.00,1.9784,24,666.0,20.20,386.73,18.85,15.40
|
||||
12.80230,0.00,18.100,0,0.7400,5.8540,96.60,1.8956,24,666.0,20.20,240.52,23.79,10.80
|
||||
10.67180,0.00,18.100,0,0.7400,6.4590,94.80,1.9879,24,666.0,20.20,43.06,23.98,11.80
|
||||
6.28807,0.00,18.100,0,0.7400,6.3410,96.40,2.0720,24,666.0,20.20,318.01,17.79,14.90
|
||||
9.92485,0.00,18.100,0,0.7400,6.2510,96.60,2.1980,24,666.0,20.20,388.52,16.44,12.60
|
||||
9.32909,0.00,18.100,0,0.7130,6.1850,98.70,2.2616,24,666.0,20.20,396.90,18.13,14.10
|
||||
7.52601,0.00,18.100,0,0.7130,6.4170,98.30,2.1850,24,666.0,20.20,304.21,19.31,13.00
|
||||
6.71772,0.00,18.100,0,0.7130,6.7490,92.60,2.3236,24,666.0,20.20,0.32,17.44,13.40
|
||||
5.44114,0.00,18.100,0,0.7130,6.6550,98.20,2.3552,24,666.0,20.20,355.29,17.73,15.20
|
||||
5.09017,0.00,18.100,0,0.7130,6.2970,91.80,2.3682,24,666.0,20.20,385.09,17.27,16.10
|
||||
8.24809,0.00,18.100,0,0.7130,7.3930,99.30,2.4527,24,666.0,20.20,375.87,16.74,17.80
|
||||
9.51363,0.00,18.100,0,0.7130,6.7280,94.10,2.4961,24,666.0,20.20,6.68,18.71,14.90
|
||||
4.75237,0.00,18.100,0,0.7130,6.5250,86.50,2.4358,24,666.0,20.20,50.92,18.13,14.10
|
||||
4.66883,0.00,18.100,0,0.7130,5.9760,87.90,2.5806,24,666.0,20.20,10.48,19.01,12.70
|
||||
8.20058,0.00,18.100,0,0.7130,5.9360,80.30,2.7792,24,666.0,20.20,3.50,16.94,13.50
|
||||
7.75223,0.00,18.100,0,0.7130,6.3010,83.70,2.7831,24,666.0,20.20,272.21,16.23,14.90
|
||||
6.80117,0.00,18.100,0,0.7130,6.0810,84.40,2.7175,24,666.0,20.20,396.90,14.70,20.00
|
||||
4.81213,0.00,18.100,0,0.7130,6.7010,90.00,2.5975,24,666.0,20.20,255.23,16.42,16.40
|
||||
3.69311,0.00,18.100,0,0.7130,6.3760,88.40,2.5671,24,666.0,20.20,391.43,14.65,17.70
|
||||
6.65492,0.00,18.100,0,0.7130,6.3170,83.00,2.7344,24,666.0,20.20,396.90,13.99,19.50
|
||||
5.82115,0.00,18.100,0,0.7130,6.5130,89.90,2.8016,24,666.0,20.20,393.82,10.29,20.20
|
||||
7.83932,0.00,18.100,0,0.6550,6.2090,65.40,2.9634,24,666.0,20.20,396.90,13.22,21.40
|
||||
3.16360,0.00,18.100,0,0.6550,5.7590,48.20,3.0665,24,666.0,20.20,334.40,14.13,19.90
|
||||
3.77498,0.00,18.100,0,0.6550,5.9520,84.70,2.8715,24,666.0,20.20,22.01,17.15,19.00
|
||||
4.42228,0.00,18.100,0,0.5840,6.0030,94.50,2.5403,24,666.0,20.20,331.29,21.32,19.10
|
||||
15.57570,0.00,18.100,0,0.5800,5.9260,71.00,2.9084,24,666.0,20.20,368.74,18.13,19.10
|
||||
13.07510,0.00,18.100,0,0.5800,5.7130,56.70,2.8237,24,666.0,20.20,396.90,14.76,20.10
|
||||
4.34879,0.00,18.100,0,0.5800,6.1670,84.00,3.0334,24,666.0,20.20,396.90,16.29,19.90
|
||||
4.03841,0.00,18.100,0,0.5320,6.2290,90.70,3.0993,24,666.0,20.20,395.33,12.87,19.60
|
||||
3.56868,0.00,18.100,0,0.5800,6.4370,75.00,2.8965,24,666.0,20.20,393.37,14.36,23.20
|
||||
4.64689,0.00,18.100,0,0.6140,6.9800,67.60,2.5329,24,666.0,20.20,374.68,11.66,29.80
|
||||
8.05579,0.00,18.100,0,0.5840,5.4270,95.40,2.4298,24,666.0,20.20,352.58,18.14,13.80
|
||||
6.39312,0.00,18.100,0,0.5840,6.1620,97.40,2.2060,24,666.0,20.20,302.76,24.10,13.30
|
||||
4.87141,0.00,18.100,0,0.6140,6.4840,93.60,2.3053,24,666.0,20.20,396.21,18.68,16.70
|
||||
15.02340,0.00,18.100,0,0.6140,5.3040,97.30,2.1007,24,666.0,20.20,349.48,24.91,12.00
|
||||
10.23300,0.00,18.100,0,0.6140,6.1850,96.70,2.1705,24,666.0,20.20,379.70,18.03,14.60
|
||||
14.33370,0.00,18.100,0,0.6140,6.2290,88.00,1.9512,24,666.0,20.20,383.32,13.11,21.40
|
||||
5.82401,0.00,18.100,0,0.5320,6.2420,64.70,3.4242,24,666.0,20.20,396.90,10.74,23.00
|
||||
5.70818,0.00,18.100,0,0.5320,6.7500,74.90,3.3317,24,666.0,20.20,393.07,7.74,23.70
|
||||
5.73116,0.00,18.100,0,0.5320,7.0610,77.00,3.4106,24,666.0,20.20,395.28,7.01,25.00
|
||||
2.81838,0.00,18.100,0,0.5320,5.7620,40.30,4.0983,24,666.0,20.20,392.92,10.42,21.80
|
||||
2.37857,0.00,18.100,0,0.5830,5.8710,41.90,3.7240,24,666.0,20.20,370.73,13.34,20.60
|
||||
3.67367,0.00,18.100,0,0.5830,6.3120,51.90,3.9917,24,666.0,20.20,388.62,10.58,21.20
|
||||
5.69175,0.00,18.100,0,0.5830,6.1140,79.80,3.5459,24,666.0,20.20,392.68,14.98,19.10
|
||||
4.83567,0.00,18.100,0,0.5830,5.9050,53.20,3.1523,24,666.0,20.20,388.22,11.45,20.60
|
||||
0.15086,0.00,27.740,0,0.6090,5.4540,92.70,1.8209,4,711.0,20.10,395.09,18.06,15.20
|
||||
0.18337,0.00,27.740,0,0.6090,5.4140,98.30,1.7554,4,711.0,20.10,344.05,23.97,7.00
|
||||
0.20746,0.00,27.740,0,0.6090,5.0930,98.00,1.8226,4,711.0,20.10,318.43,29.68,8.10
|
||||
0.10574,0.00,27.740,0,0.6090,5.9830,98.80,1.8681,4,711.0,20.10,390.11,18.07,13.60
|
||||
0.11132,0.00,27.740,0,0.6090,5.9830,83.50,2.1099,4,711.0,20.10,396.90,13.35,20.10
|
||||
0.17331,0.00,9.690,0,0.5850,5.7070,54.00,2.3817,6,391.0,19.20,396.90,12.01,21.80
|
||||
0.27957,0.00,9.690,0,0.5850,5.9260,42.60,2.3817,6,391.0,19.20,396.90,13.59,24.50
|
||||
0.17899,0.00,9.690,0,0.5850,5.6700,28.80,2.7986,6,391.0,19.20,393.29,17.60,23.10
|
||||
0.28960,0.00,9.690,0,0.5850,5.3900,72.90,2.7986,6,391.0,19.20,396.90,21.14,19.70
|
||||
0.26838,0.00,9.690,0,0.5850,5.7940,70.60,2.8927,6,391.0,19.20,396.90,14.10,18.30
|
||||
0.23912,0.00,9.690,0,0.5850,6.0190,65.30,2.4091,6,391.0,19.20,396.90,12.92,21.20
|
||||
0.17783,0.00,9.690,0,0.5850,5.5690,73.50,2.3999,6,391.0,19.20,395.77,15.10,17.50
|
||||
0.22438,0.00,9.690,0,0.5850,6.0270,79.70,2.4982,6,391.0,19.20,396.90,14.33,16.80
|
||||
0.06263,0.00,11.930,0,0.5730,6.5930,69.10,2.4786,1,273.0,21.00,391.99,9.67,22.40
|
||||
0.04527,0.00,11.930,0,0.5730,6.1200,76.70,2.2875,1,273.0,21.00,396.90,9.08,20.60
|
||||
0.06076,0.00,11.930,0,0.5730,6.9760,91.00,2.1675,1,273.0,21.00,396.90,5.64,23.90
|
||||
0.10959,0.00,11.930,0,0.5730,6.7940,89.30,2.3889,1,273.0,21.00,393.45,6.48,22.00
|
||||
0.04741,0.00,11.930,0,0.5730,6.0300,80.80,2.5050,1,273.0,21.00,396.90,7.88,11.90
|
||||
|
33
lipatov_ilya_lab_3/lab3.py
Normal file
@@ -0,0 +1,33 @@
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.tree import DecisionTreeClassifier
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
pd.options.mode.chained_assignment = None
|
||||
|
||||
FILE_PATH = "boston.csv"
|
||||
REQUIRED_COLUMNS = ['CRIM', 'DIS', 'TAX']
|
||||
TARGET_COLUMN = 'RAD'
|
||||
|
||||
|
||||
def print_classifier_info(feature_importance):
|
||||
feature_names = REQUIRED_COLUMNS
|
||||
embarked_score = feature_importance[-3:].sum()
|
||||
scores = np.append(feature_importance[:2], embarked_score)
|
||||
scores = map(lambda score: round(score, 2), scores)
|
||||
print(dict(zip(feature_names, scores)))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
data = pd.read_csv(FILE_PATH)
|
||||
|
||||
X = data[REQUIRED_COLUMNS]
|
||||
y = data[TARGET_COLUMN]
|
||||
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
||||
|
||||
classifier_tree = DecisionTreeClassifier(random_state=42)
|
||||
classifier_tree.fit(X_train, y_train)
|
||||
|
||||
print_classifier_info(classifier_tree.feature_importances_)
|
||||
print("Оценка качества (задача классификации) - ", classifier_tree.score(X_test, y_test))
|
||||
BIN
lipatov_ilya_lab_3/result.jpg
Normal file
|
After Width: | Height: | Size: 26 KiB |
1001
madyshev_egor_lab_3/StudentsPerformance.csv
Normal file
46
madyshev_egor_lab_3/main.py
Normal file
@@ -0,0 +1,46 @@
|
||||
import numpy as np
|
||||
import pandas as pb
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.linear_model import LinearRegression, Perceptron
|
||||
from sklearn.neural_network import MLPClassifier, MLPRegressor
|
||||
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, MinMaxScaler
|
||||
from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier
|
||||
|
||||
df = pb.read_csv("StudentsPerformance.csv", sep=",", encoding="windows-1251")
|
||||
df1 = df
|
||||
print("Данные без подготовки:")
|
||||
with pb.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 1000):
|
||||
print(df[:5])
|
||||
|
||||
def prepareStringData(columnName):
|
||||
uniq = df[columnName].unique()
|
||||
mp = {}
|
||||
for i in uniq:
|
||||
mp[i] = len(mp)
|
||||
df[columnName] = df[columnName].map(mp)
|
||||
|
||||
|
||||
print()
|
||||
print("Данные после подготовки:")
|
||||
prepareStringData("gender")
|
||||
prepareStringData("race/ethnicity")
|
||||
prepareStringData("parental level of education")
|
||||
prepareStringData("lunch")
|
||||
prepareStringData("test preparation course")
|
||||
with pb.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 1000):
|
||||
print(df[:5])
|
||||
|
||||
X = df[["gender", "race/ethnicity", "lunch", "test preparation course", "math score", "reading score", "writing score"]]
|
||||
y = df["parental level of education"]
|
||||
X_train, X_Test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=42)
|
||||
dtc = DecisionTreeClassifier()
|
||||
dtc = dtc.fit(X_train, y_train)
|
||||
dtr = DecisionTreeRegressor()
|
||||
dtr = dtr.fit(X_train, y_train)
|
||||
print()
|
||||
print("Результат дерева класификации на учебных данных: ", dtc.score(X_train, y_train))
|
||||
print("Результат дерева класификации на тестовых данных: ", dtc.score(X_Test, y_test))
|
||||
print()
|
||||
print("Результат дерева регрессии на учебных данных: ", dtr.score(X_train, y_train))
|
||||
print("Результат дерева регрессии на тестовых данных: ", dtr.score(X_Test, y_test))
|
||||
41
madyshev_egor_lab_3/readme.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Задание
|
||||
Решите с помощью библиотечной реализации дерева решений задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету «Методы искусственного интеллекта» на 99% ваших данных. Проверьте работу модели на оставшемся проценте, сделайте вывод
|
||||
## Задание по варианту
|
||||
Задача для дерева решений. Предсказание уровня образования родителей по всем остальных данным.
|
||||
## Решение
|
||||
### Запуск программы
|
||||
Для запуска программы необходимо запустить файл main.py, содержащий код программы
|
||||
### Используемые технологии
|
||||
Программа использует следующие библиотеки:
|
||||
- numpy - библиотека для работы с массивами и матрицами.
|
||||
- matplotlib - библиотека для создания графиков и визуализации данных.
|
||||
- sklearn - библиотека для машинного обучения и анализа данных.
|
||||
### Что делает программа
|
||||
Программа читает данные из csv файла. Подготавливает их для работы модели, приводя текстовые параметры к числам. И пытается научиться предсказывать уровень образования родителей по данным об их детях.
|
||||
### Тесты
|
||||
Данные без подготовки:
|
||||
gender race/ethnicity parental level of education lunch test preparation course math score reading score writing score
|
||||
0 female group B bachelor's degree standard none 72 72 74
|
||||
1 female group C some college standard completed 69 90 88
|
||||
2 female group B master's degree standard none 90 95 93
|
||||
3 male group A associate's degree free/reduced none 47 57 44
|
||||
4 male group C some college standard none 76 78 75
|
||||
|
||||
Данные после подготовки:
|
||||
gender race/ethnicity parental level of education lunch test preparation course math score reading score writing score
|
||||
0 0 0 0 0 0 72 72 74
|
||||
1 0 1 1 0 1 69 90 88
|
||||
2 0 0 2 0 0 90 95 93
|
||||
3 1 2 3 1 0 47 57 44
|
||||
4 1 1 1 0 0 76 78 75
|
||||
|
||||
Результат дерева классификации на учебных данных: 0.998989898989899
|
||||
Результат дерева классификации на тестовых данных: 0.2
|
||||
|
||||
Результат дерева регрессии на учебных данных: 0.9984005221729634
|
||||
Результат дерева регрессии на тестовых данных: -1.2264150943396226
|
||||
|
||||
По результатам двух типов моделей деревьев видно, что модель дерева решений не подходит для предсказания уровня образования родителей по этим данным. Или на практике не существует такой зависимости.
|
||||
С целью проверки не переобучилась ли модель были проведены тесты с изменением параметров программы.
|
||||
Изменение объема обучающей выборки и регулирование параметров моделей деревьев результат не поменяло.
|
||||
Это значит, что модель не была переобучена.
|
||||
1001
madyshev_egor_lab_4/StudentsPerformance.csv
Normal file
BIN
madyshev_egor_lab_4/lab4_1.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
madyshev_egor_lab_4/lab4_2.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
54
madyshev_egor_lab_4/main.py
Normal file
@@ -0,0 +1,54 @@
|
||||
import numpy as np
|
||||
import pandas as pb
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn.model_selection import train_test_split
|
||||
from sklearn.linear_model import LinearRegression, Perceptron
|
||||
from sklearn.neural_network import MLPClassifier, MLPRegressor
|
||||
from sklearn.preprocessing import LabelEncoder, OneHotEncoder, MinMaxScaler
|
||||
from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier
|
||||
from scipy.cluster.hierarchy import dendrogram, linkage
|
||||
|
||||
df = pb.read_csv("StudentsPerformance.csv", sep=",", encoding="windows-1251")
|
||||
df1 = df
|
||||
print("Данные без подготовки:")
|
||||
with pb.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 1000):
|
||||
print(df[:5])
|
||||
|
||||
def prepareStringData(columnName):
|
||||
uniq = df[columnName].unique()
|
||||
mp = {}
|
||||
for i in uniq:
|
||||
mp[i] = len(mp)
|
||||
df[columnName] = df[columnName].map(mp)
|
||||
|
||||
|
||||
print()
|
||||
print("Данные после подготовки:")
|
||||
prepareStringData("gender")
|
||||
prepareStringData("race/ethnicity")
|
||||
prepareStringData("parental level of education")
|
||||
prepareStringData("lunch")
|
||||
prepareStringData("test preparation course")
|
||||
with pb.option_context('display.max_rows', None, 'display.max_columns', None, 'display.width', 1000):
|
||||
print(df[:5])
|
||||
|
||||
|
||||
X = df[:15]
|
||||
X = X[["math score", "reading score", "writing score"]].values
|
||||
labelList = []
|
||||
for i in X:
|
||||
st = ""
|
||||
for j in i:
|
||||
st += str(j)
|
||||
st += ","
|
||||
st = "(" + st[:len(st) - 1] + ")"
|
||||
labelList.append(st)
|
||||
linked = linkage(X, 'single')
|
||||
|
||||
plt.figure(figsize=(10, 7))
|
||||
dendrogram(linked,
|
||||
orientation='top',
|
||||
labels=labelList,
|
||||
distance_sort='descending',
|
||||
show_leaf_counts=True)
|
||||
plt.show()
|
||||
24
madyshev_egor_lab_4/readme.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Задание
|
||||
Использовать метод кластеризации по варианту для данных из таблицы 1 по варианту (таблица 9), самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо он подходит для решения сформулированной вами задачи.
|
||||
## Задание по варианту
|
||||
Задача для дерева решений. Предсказание уровня образования родителей по всем остальных данным.
|
||||
## Решение
|
||||
### Запуск программы
|
||||
Алгоритм кластеризации: dendrogram
|
||||
### Используемые технологии
|
||||
Программа использует следующие библиотеки:
|
||||
- numpy - библиотека для работы с массивами и матрицами.
|
||||
- matplotlib - библиотека для создания графиков и визуализации данных.
|
||||
- sklearn - библиотека для машинного обучения и анализа данных.
|
||||
### Что делает программа
|
||||
Программа читает данные из csv файла. Подготавливает их для работы модели, приводя текстовые параметры к числам. И кластеризует учеников по результатам их экзаменов.
|
||||
### Тесты
|
||||

|
||||
|
||||
На примере первых пятнадцати учеников хорошо видна их кластеризация дендрограммой. Ученики легко бьются на группы по их успеваемости.
|
||||
Благодаря этому можно выделить группы учеников в зависимости от их оценок. Достаточно выбрать необходимую ветвь.
|
||||
|
||||

|
||||
Хотя диаграмма на большее количество учеников и становиться более насыщенной. В ней всё равно достаточно просто выделить группы учеников по успеваемости.
|
||||
|
||||
Вывод: Кластеризация дендрограммой позволяет достаточно эффективно делить учащихся на группы по успеваемости, основываясь на оценках их экзаменов.
|
||||
3
savenkov_alexander_lab_1/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
1
savenkov_alexander_lab_1/.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
||||
main.py
|
||||
10
savenkov_alexander_lab_1/.idea/Lab_1_IIS.iml
generated
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
7
savenkov_alexander_lab_1/.idea/discord.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="ASK" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
</project>
|
||||
6
savenkov_alexander_lab_1/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
7
savenkov_alexander_lab_1/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||
<component name="PyCharmProfessionalAdvertiser">
|
||||
<option name="shown" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
8
savenkov_alexander_lab_1/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Lab_1_IIS.iml" filepath="$PROJECT_DIR$/.idea/Lab_1_IIS.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
62
savenkov_alexander_lab_1/app.py
Normal file
@@ -0,0 +1,62 @@
|
||||
import numpy as np
|
||||
from flask import Flask, request, render_template
|
||||
from sklearn.datasets import make_moons
|
||||
from sklearn.linear_model import LinearRegression
|
||||
from sklearn.preprocessing import PolynomialFeatures
|
||||
from sklearn.linear_model import Ridge
|
||||
from sklearn.model_selection import train_test_split
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route('/')
|
||||
def home():
|
||||
return render_template('index.html')
|
||||
|
||||
@app.route('/compare_models', methods=['POST'])
|
||||
def compare_models():
|
||||
# Генерация данных
|
||||
rs = 0
|
||||
X, y = make_moons(noise=0.3, random_state=rs)
|
||||
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=rs)
|
||||
|
||||
# Линейная регрессия
|
||||
lr = LinearRegression()
|
||||
lr.fit(X_train, y_train)
|
||||
lr_score = lr.score(X_test, y_test)
|
||||
|
||||
# Полиномиальная регрессия (степень 3)
|
||||
poly = PolynomialFeatures(degree=3)
|
||||
X_poly = poly.fit_transform(X_train)
|
||||
poly_reg = LinearRegression()
|
||||
poly_reg.fit(X_poly, y_train)
|
||||
poly_score = poly_reg.score(poly.transform(X_test), y_test)
|
||||
|
||||
# Гребневая полиномиальная регрессия (степень 3, alpha=1.0)
|
||||
ridge = Ridge(alpha=1.0)
|
||||
ridge.fit(X_poly, y_train)
|
||||
ridge_score = ridge.score(poly.transform(X_test), y_test)
|
||||
|
||||
# Создание графиков
|
||||
plt.figure(figsize=(12, 4))
|
||||
|
||||
plt.subplot(131)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.RdBu)
|
||||
plt.title('Линейная регрессия\n(Score: {:.2f})'.format(lr_score))
|
||||
|
||||
plt.subplot(132)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.RdBu)
|
||||
plt.title('Полиномиальная регрессия\n(Score: {:.2f})'.format(poly_score))
|
||||
|
||||
plt.subplot(133)
|
||||
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.RdBu)
|
||||
plt.title('Гребневая полиномиальная регрессия\n(Score: {:.2f})'.format(ridge_score))
|
||||
|
||||
plt.tight_layout()
|
||||
|
||||
plt.savefig('static/models_comparison.png')
|
||||
|
||||
return render_template('index.html', result=True)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
63
savenkov_alexander_lab_1/readme.md
Normal file
@@ -0,0 +1,63 @@
|
||||
Общее задание:
|
||||
Используя код из пункта «Регуляризация и сеть прямого
|
||||
распространения» из [1] (стр. 228), сгенерируйте определенный тип данных и
|
||||
сравните на нем 3 модели (по варианту). Постройте графики, отобразите
|
||||
качество моделей, объясните полученные результаты.
|
||||
|
||||
Задание по вариантам 1 вариант (22), взял 1 т.к. всего 21 вариант задания:
|
||||
1. Данные: make_moons (noise=0.3, random_state=rs)
|
||||
Модели:
|
||||
· Линейную регрессию
|
||||
· Полиномиальную регрессию (со степенью 3)
|
||||
· Гребневую полиномиальную регрессию (со степенью 3, alpha = 1.0)
|
||||
|
||||
Запуск приложения осуществляется запуском файла app.py
|
||||
|
||||
Использованные технологии:
|
||||
Среда программирования Pycharm
|
||||
Версия языка python: 3.11
|
||||
Flask: Flask - это микрофреймворк для создания веб-приложений на языке Python. Он используется для создания веб-сервера и определения маршрутов, таких как '/' и '/compare_models', для обработки запросов.
|
||||
|
||||
HTML: Ваш шаблон index.html использует язык разметки HTML для создания веб-страницы и отображения содержимого на веб-сайте.
|
||||
|
||||
Matplotlib: Matplotlib - это библиотека для создания графиков и визуализации данных. В этой программе она используется для создания трех графиков, представляющих результаты различных моделей.
|
||||
|
||||
NumPy: NumPy - это библиотека для вычислительных операций с массивами и матрицами. В этой программе она используется для генерации данных (make_moons) и работы с данными.
|
||||
|
||||
Scikit-Learn (sklearn): Scikit-Learn - это библиотека машинного обучения для Python. Она используется для обучения трех моделей машинного обучения: линейной регрессии, полиномиальной регрессии и гребневой полиномиальной регрессии.
|
||||
|
||||
Jinja2: Flask использует шаблонизатор Jinja2 для вставки динамических данных (например, параметра result) в HTML-шаблоны.
|
||||
|
||||
Файловая система и статические файлы: В программе используется файловая система для сохранения изображений графиков (static/models_comparison.png). Эти изображения затем отображаются на веб-странице как статические файлы.
|
||||
|
||||
Краткое описание работы программы:
|
||||
В разделе HTML (index.html) определен шаблон для главной страницы. Этот шаблон содержит заголовок, форму для отправки POST-запроса на /compare_models и, если result истинно, отображает изображение графиков моделей.
|
||||
|
||||
В Python-скрипте (app.py) создается Flask-приложение, которое имеет два маршрута:
|
||||
|
||||
'/' отвечает за главную страницу и отображает шаблон index.html.
|
||||
'/compare_models' обрабатывает POST-запрос, обучает различные модели и создает графики. После этого он возвращает результат в виде изображений и обновляет страницу с параметром result=True, чтобы отобразить изображения.
|
||||
Для генерации данных используется make_moons, а затем данные разбиваются на обучающий и тестовый наборы.
|
||||
|
||||
Тренируются три модели: линейная регрессия, полиномиальная регрессия (степень 3) и гребневая полиномиальная регрессия (степень 3, alpha=1.0).
|
||||
|
||||
После обучения моделей создаются три графика, каждый из которых представляет собой точечное облако с цветной разметкой, а также заголовок, содержащий оценку (score) модели.
|
||||
|
||||
Графики сохраняются в файл static/models_comparison.png.
|
||||
|
||||
Наконец, приложение запускается с debug=True в режиме отладки.
|
||||
|
||||
Пример входных данных:
|
||||
X = [[-0.5, 0.5],
|
||||
[0.2, 1.2],
|
||||
[1.5, -0.3],
|
||||
...
|
||||
] # Матрица признаков
|
||||
|
||||
y = [0, 1, 0, 1, 1, 0, 0, 1, ...] # Вектор меток классов
|
||||
|
||||
Пример выходных данных:
|
||||
Графики моделей: Это изображения, на которых отображены точки данных с цветной разметкой в соответствии с предсказанными значениями моделей.
|
||||
Оценки моделей: В заголовках графиков отображаются оценки моделей (например, Score: 0.85), которые показывают качество каждой модели на тестовых данных.
|
||||
|
||||
Обновленная главная страница: После генерации графиков, главная страница (index.html) обновляется, и на ней отображаются созданные графики моделей.
|
||||
BIN
savenkov_alexander_lab_1/static/models_comparison.png
Normal file
|
After Width: | Height: | Size: 35 KiB |
17
savenkov_alexander_lab_1/templates/index.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Сравнение моделей</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Сравнение моделей</h1>
|
||||
<form action="/compare_models" method="POST">
|
||||
<button type="submit">Сравнить модели</button>
|
||||
</form>
|
||||
<br>
|
||||
{% if result %}
|
||||
<h2>Графики моделей</h2>
|
||||
<img src="static/models_comparison.png" alt="Графики моделей">
|
||||
{% endif %}
|
||||
</body>
|
||||
</html>
|
||||
3
savenkov_alexander_lab_2/.idea/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
1
savenkov_alexander_lab_2/.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
||||
app.py
|
||||
10
savenkov_alexander_lab_2/.idea/Lab_2_IIS.iml
generated
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.11" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
7
savenkov_alexander_lab_2/.idea/discord.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DiscordProjectSettings">
|
||||
<option name="show" value="ASK" />
|
||||
<option name="description" value="" />
|
||||
</component>
|
||||
</project>
|
||||
6
savenkov_alexander_lab_2/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
7
savenkov_alexander_lab_2/.idea/misc.xml
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||
<component name="PyCharmProfessionalAdvertiser">
|
||||
<option name="shown" value="true" />
|
||||
</component>
|
||||
</project>
|
||||
8
savenkov_alexander_lab_2/.idea/modules.xml
generated
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Lab_2_IIS.iml" filepath="$PROJECT_DIR$/.idea/Lab_2_IIS.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
94
savenkov_alexander_lab_2/app.py
Normal file
@@ -0,0 +1,94 @@
|
||||
from flask import Flask, request, render_template
|
||||
from sklearn.linear_model import LinearRegression
|
||||
from sklearn.feature_selection import RFE
|
||||
from sklearn.ensemble import RandomForestRegressor
|
||||
from sklearn.preprocessing import MinMaxScaler
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
# Генерируем случайные данные
|
||||
np.random.seed(0)
|
||||
size = 750
|
||||
X = np.random.uniform(0, 1, (size, 14))
|
||||
Y = (10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - .5) ** 2 +
|
||||
10 * X[:, 3] + 5 * X[:, 4] ** 5 + np.random.normal(0, 1, size))
|
||||
X[:, 10:] = X[:, :4] + np.random.normal(0, .025, (size, 4))
|
||||
|
||||
# Определяем и обучаем модели
|
||||
lr = LinearRegression()
|
||||
rfe = RFE(lr, n_features_to_select=2)
|
||||
rfe.fit(X, Y)
|
||||
|
||||
rf = RandomForestRegressor(n_estimators=100)
|
||||
rf.fit(X, Y)
|
||||
|
||||
# Словарь для хранения результатов оценок
|
||||
feature_rankings = {}
|
||||
|
||||
|
||||
# Функция для ранжирования признаков с использованием линейной регрессии
|
||||
def rank_lr():
|
||||
lr.fit(X, Y)
|
||||
coef = lr.coef_
|
||||
ranking = np.abs(coef)
|
||||
ranking = min_max_scale(ranking)
|
||||
return ranking
|
||||
|
||||
|
||||
# Функция для ранжирования признаков с использованием RFE
|
||||
def rank_rfe():
|
||||
ranking = rfe.ranking_
|
||||
ranking = min_max_scale(ranking)
|
||||
return ranking
|
||||
|
||||
|
||||
# Функция для ранжирования признаков с использованием Random Forest
|
||||
def rank_rf():
|
||||
importances = rf.feature_importances_
|
||||
importances = min_max_scale(importances)
|
||||
return importances
|
||||
|
||||
|
||||
# Функция для масштабирования оценок в диапазоне [0, 1]
|
||||
def min_max_scale(arr):
|
||||
scaler = MinMaxScaler()
|
||||
scaled = scaler.fit_transform(np.array(arr).reshape(-1, 1))
|
||||
return scaled
|
||||
|
||||
|
||||
# Функция для выполнения ранжирования и вычисления средней оценки
|
||||
def rank_features():
|
||||
feature_rankings['Linear Regression'] = rank_lr()
|
||||
feature_rankings['RFE'] = rank_rfe()
|
||||
feature_rankings['Random Forest'] = rank_rf()
|
||||
# Средняя оценка
|
||||
mean_ranking = np.mean(list(feature_rankings.values()), axis=0)
|
||||
feature_rankings['Mean Ranking'] = mean_ranking
|
||||
|
||||
# Получите индексы 4 самых важных признаков
|
||||
top_4_indices = np.argsort(mean_ranking)[-4:][::-1]
|
||||
|
||||
# Получите названия признаков по индексам
|
||||
top_4_feature_names = [f'Признак {i + 1}' for i in top_4_indices]
|
||||
|
||||
# Добавьте значения X и Y в контекст
|
||||
return {
|
||||
'feature_rankings': feature_rankings,
|
||||
'X_values': X.tolist(),
|
||||
'Y_values': Y.tolist(),
|
||||
'top_4_feature_names': top_4_feature_names # Добавляем самые важные признаки
|
||||
}
|
||||
|
||||
|
||||
@app.route('/', methods=['GET', 'POST'])
|
||||
def index():
|
||||
if request.method == 'POST':
|
||||
context = rank_features()
|
||||
return render_template('index.html', **context)
|
||||
return render_template('index.html', feature_rankings=feature_rankings)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
||||
60
savenkov_alexander_lab_2/readme.md
Normal file
@@ -0,0 +1,60 @@
|
||||
Общее задание:
|
||||
Используя код из [1] (пункт «Решение задачи ранжирования признаков»,
|
||||
стр. 205), выполните ранжирование признаков с помощью указанных по
|
||||
варианту моделей. Отобразите получившиеся значения\оценки каждого
|
||||
признака каждым методом\моделью и среднюю оценку. Проведите анализ
|
||||
получившихся результатов. Какие четыре признака оказались самыми
|
||||
45
|
||||
важными по среднему значению? (Названия\индексы признаков и будут
|
||||
ответом на задание).
|
||||
|
||||
Задание по вариантам 2 вариант (22), взял 2 т.к. всего 20 вариант задания:
|
||||
2. Линейная регрессия (LinearRegression), Рекурсивное сокращение
|
||||
признаков (Recursive Feature Elimination – RFE), Сокращение признаков
|
||||
Случайными деревьями (Random Forest Regressor)
|
||||
|
||||
Запуск приложения осуществляется запуском файла app.py
|
||||
|
||||
Использованные технологии:
|
||||
Среда программирования Pycharm
|
||||
Версия языка python: 3.11
|
||||
Flask: Flask - это микрофреймворк для создания веб-приложений на языке Python. Он используется для создания веб-интерфейса и обработки HTTP-запросов и ответов.
|
||||
|
||||
scikit-learn: Scikit-learn - это библиотека для машинного обучения в Python. В вашей программе она используется для обучения моделей машинного обучения, таких как линейная регрессия, RFE и случайный лес, а также для выполнения ранжирования признаков.
|
||||
|
||||
NumPy: NumPy - это библиотека для научных вычислений в Python. Она используется для работы с массивами и матрицами данных.
|
||||
|
||||
Pandas: Pandas - это библиотека для анализа данных. Она используется для создания и обработки данных, включая таблицы и структуры данных.
|
||||
|
||||
MinMaxScaler: Это функция из библиотеки Scikit-learn, используемая для масштабирования оценок признаков в диапазоне [0, 1].
|
||||
|
||||
HTML и шаблоны Jinja2: HTML - это язык разметки для создания веб-страниц, а Jinja2 - это шаблонный движок для вставки данных в HTML-шаблоны.
|
||||
|
||||
HTTP и формы: Ваше приложение Flask обрабатывает HTTP-запросы и использует форму <form> для отправки данных при нажатии кнопки "Выполнить".
|
||||
|
||||
Краткое описание работы программы:
|
||||
Сгенерированные данные: Программа создает случайные данные в виде матрицы X и вектора Y.
|
||||
|
||||
Обучение моделей: Обучаются три модели машинного обучения: линейная регрессия, RFE (рекурсивное исключение признаков) и случайные леса, используя сгенерированные данные.
|
||||
|
||||
Ранжирование признаков: Для каждой модели рассчитываются ранги признаков, отражающие их важность для прогнозирования целевой переменной Y.
|
||||
|
||||
Средний ранг: Вычисляется средний ранг для каждого признака на основе результатов всех трех моделей.
|
||||
|
||||
Вывод результатов: После нажатия кнопки "Выполнить" на веб-странице, программа отображает следующие результаты:
|
||||
|
||||
Ранги признаков для каждой модели (линейная регрессия, RFE, случайные леса).
|
||||
Средний ранг признаков.
|
||||
Значения признаков X.
|
||||
Значения целевой переменной Y.
|
||||
4 самых важных признака на основе среднего ранга (по названиям).
|
||||
|
||||
Пример входных данных:
|
||||
Случайные данные в виде матрицы X и вектора Y.
|
||||
|
||||
Пример выходных данных:
|
||||
Ранги признаков для каждой модели (линейная регрессия, RFE, случайные леса).
|
||||
Средний ранг признаков.
|
||||
Значения признаков X.
|
||||
Значения целевой переменной Y.
|
||||
4 самых важных признака на основе среднего ранга (по названиям).
|
||||
73
savenkov_alexander_lab_2/templates/index.html
Normal file
@@ -0,0 +1,73 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Feature Ranking</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Feature Ranking</h1>
|
||||
<form method="POST">
|
||||
<button type="submit">Выполнить</button>
|
||||
</form>
|
||||
|
||||
<h2>Результаты ранжирования признаков</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<th>Метод</th>
|
||||
<th>Признак 1</th>
|
||||
<th>Признак 2</th>
|
||||
<!-- Добавьте остальные признаки -->
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Линейная регрессия</td>
|
||||
<td>{{ feature_rankings['Linear Regression'][0] if 'Linear Regression' in feature_rankings else '' }}</td>
|
||||
<td>{{ feature_rankings['Linear Regression'][1] if 'Linear Regression' in feature_rankings else '' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>RFE</td>
|
||||
<td>{{ feature_rankings['RFE'][0] if 'RFE' in feature_rankings else '' }}</td>
|
||||
<td>{{ feature_rankings['RFE'][1] if 'RFE' in feature_rankings else '' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Случайные деревья</td>
|
||||
<td>{{ feature_rankings['Random Forest'][0] if 'Random Forest' in feature_rankings else '' }}</td>
|
||||
<td>{{ feature_rankings['Random Forest'][1] if 'Random Forest' in feature_rankings else '' }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Средняя оценка</td>
|
||||
<td>{{ feature_rankings['Mean Ranking'][0] if 'Mean Ranking' in feature_rankings else '' }}</td>
|
||||
<td>{{ feature_rankings['Mean Ranking'][1] if 'Mean Ranking' in feature_rankings else '' }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h2>Самые важные признаки</h2>
|
||||
<ul>
|
||||
{% for feature_name in top_4_feature_names %}
|
||||
<li>{{ feature_name }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
<h2>Значения X</h2>
|
||||
<table>
|
||||
{% for row in X_values %}
|
||||
<tr>
|
||||
{% for value in row %}
|
||||
<td>{{ value }}</td>
|
||||
{% if loop.index % 10 == 0 %}</tr><tr>{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<h2>Значения Y</h2>
|
||||
<table>
|
||||
<tr>
|
||||
{% for value in Y_values %}
|
||||
<td>{{ value }}</td>
|
||||
{% if loop.index % 10 == 0 %}</tr><tr>{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||