Много раз приходится сталкиваться с графиком, где требуется знать координаты конкретной точки на данном графике.

Скажем, вам дана эта информация.

train = plt.plot(alphas,train_score)
test = plt.plot(alphas,test_score)
plt.xlabel('alphas')
plt.ylabel('scores')
plt.legend(['train_data','test_data'])

С помощью приведенной выше информации вам нужно найти значение альфа, которое уменьшает переоснащение для этого набора данных. Уменьшение переобучения означает нахождение альфы, которая уменьшает train_score и увеличивает test_score. Это кажется довольно простым, верно! В зеленой точке на оранжевой кривой результат теста кажется самым высоким, а train_score также снизился. Теперь задача найти координаты зеленых точек.

Как насчет того, чтобы сначала собрать точки данных, с помощью которых был создан этот график? Что ж, это кажется вполне разумным. Для этого требуется использовать функцию get_data().

alphas, train_score = train[0].get_data()
alphas, test_score = test[0].get_data()
print(alphas)
[0.         0.00096489 0.00098789 0.00114515 0.00124694 0.00128829  0.00129756 0.00130342 0.00133601 0.00133601 0.00133601 0.00150301  0.00150301 0.00150301 0.00150301 0.00162229 0.00167001 0.00167001  0.00167001 0.00167001 0.00167001 0.00187876 0.00195846 0.00200401  0.00200401 0.00200401 0.00200401 0.00210421 0.00210421 0.00233801  0.00233801 0.00233801 0.00233801 0.00240481 0.00250501 0.00260521  0.00265076 0.00266247 0.00267201 0.00271654 0.00291323 0.00350701  0.00360721 0.00400802 0.00400802 0.00420291 0.00447004 0.00467602  0.00475952 0.00505253 0.00506182 0.00534402 0.00704743 0.00771503  0.00910154 0.0099666  0.01100061 0.01235805 0.01723065 0.02204007  0.02882662 0.03274302 0.04949816 0.08278501]

Небольшой осмотр данных говорит нам, что альфы дискретны и конечны. Как насчет того, чтобы попытаться изобразить эти точки как маркеры, а не как кривую линию. Давайте посмотрим, куда это нас приведет. Чтобы нанести точки как маркеры, в команду plt.plot() внесено одно небольшое изменение.

train = plt.plot(alphas,train_score,'r*')
test = plt.plot(alphas,test_score,'b*')
plt.xlabel('alphas')
plt.ylabel('scores')
plt.legend(['train_data','test_data'])

Вот что мы получаем. Это намного лучше, чем предыдущий график для нашей цели. Далее, немного приглядевшись, мы обнаруживаем, что искомая точка лежит в диапазоне [0,00,0,02]. Это означает, что единственная часть графика, которая нас интересует, — это то, где альфа находится в диапазоне [0,00,0,02]. Чтобы ограничить график в этом диапазоне, мы используем plt.xlim().

Уточняя альфа-диапазон снова и снова, мы получаем:

plt.figure(figsize = (10,10))
plt.subplot(2,2,1)
train = plt.plot(alphas,train_score,'r*')
test = plt.plot(alphas,test_score,'b*')
plt.xlabel('alphas')
plt.ylabel('scores')
plt.legend(['train_data','test_data'])
plt.subplot(2,2,2)
train = plt.plot(alphas,train_score,'r*')
test = plt.plot(alphas,test_score,'b*')
plt.xlim([0.00,0.02])
plt.xlabel('alphas')
plt.ylabel('scores')
plt.legend(['train_data','test_data'])
plt.subplot(2,2,3)
train = plt.plot(alphas,train_score,'r*')
test = plt.plot(alphas,test_score,'b*')
plt.xlim([0.005,0.007])
plt.xlabel('alphas')
plt.ylabel('scores')
plt.legend(['train_data','test_data'])
plt.subplot(2,2,4)
train = plt.plot(alphas,train_score,'r*')
test = plt.plot(alphas,test_score,'b*')
plt.xlim([0.005,0.0075])
plt.xlabel('alphas')
plt.ylabel('scores')
plt.legend(['train_data','test_data'])

Наконец, мы знаем, что диапазон лежит в нужной точке. Это [0,005,0,007]. Вы можете дополнительно уточнить диапазон или попробовать другие диапазоны, используя приведенный выше код.

Чтобы найти координату нашей точки, мы сначала извлекаем альфы в диапазоне [0,005,0,007], а затем используем их индекс, чтобы найти train_score и результат теста.

# to find the alphas in range [0.005,0.007]
new_alphas = []
for i in (alphas[alphas>0.0050]):
for j in (alphas[alphas<0.0070]):
if i == j :
new_alphas.append(i)
n_index = []
new_train = []
new_test = []
for n in new_alphas:
n_index.append(alphas.tolist().index(n))  # to find the index of alphas
new_train.append(train_score[alphas.tolist().index(n)]) # finding train_score on that index
new_test.append(test_score[alphas.tolist().index(n)])# finding test_score on that index
print(f'alpha values ',new_alphas)
print(f'Train scores {new_train}')
print(f'Test scores {new_test}')
Output :
alpha values  [0.0050525293010262925, 0.005061817038712009, 0.005344021376085506] 
Train scores [0.86172, 0.85772, 0.85371] 
Test scores [0.792, 0.784, 0.792]

Нам нужна альфа = 0,0050525293010262925, train_score = 0,86172 и test_score = 0,792.

Заключение этого поста - найти координаты любой точки на заданном графике:

  1. Вы найдете точку данных, используемую для построения графика.
  2. Вы пытаетесь сделать маркеры точек, а не создавать линию.
  3. Вы изолируете нужную точку и находите диапазон, в котором лежит x.
  4. Вы используете код, чтобы найти значения x, которые лежат в диапазоне, и найти соответствующие значения y.

Большое спасибо за чтение этой статьи. Это моя первая статья. Я студент науки о данных. Если у вас есть другой более эффективный способ решить эту проблему, пожалуйста, прокомментируйте. Любые предложения приветствуются!

Надеемся увидеть Вас снова. :)