Шаг за шагом, чтобы спрогнозировать вовлеченность влиятельных лиц Instagram от получения данных Instagram до прогнозирования с помощью машинного обучения
В последние несколько недель я пытался создать мини-проект по науке о данных, связанный с машинным обучением. После долгих раздумий я, наконец, решил создать модель машинного обучения, которая может предсказать, будет ли взаимодействие с влиятельными лицами в Instagram расти или снижаться в в следующем месяце. Этот мини-проект является сквозным проектом, и эта статья будет разделена на 4 раздела, а именно:
- Получение данных от влиятельных лиц Instagram с помощью Selenium и Beautiful Soup.
- Предварительная обработка данных начинается с очистки данных, разработки функций, выбора функций и т. Д. До тех пор, пока данные не будут готовы к использованию в модели машинного обучения.
- При моделировании используется алгоритм машинного обучения (Линейная регрессия, Случайный лес, XGBoost), а также выполняется некоторая настройка гиперпараметров.
- Интерпретация результатов прогнозов машинного обучения.
Так что после прочтения этой статьи я надеялся, что читатель сможет получить некоторые знания, связанные с получением внешних данных, предварительной обработкой данных и моделью машинного обучения. И готовы начать свой собственный учебный проект Mini Machijne!.
Чтобы следовать этому руководству, вы должны как минимум знать:
1. Основы программирования на Python.
2. Pandas и Numpy библиотеки для инструментов анализа данных.
3. Библиотеки Matplotlib и Seaborn для визуализации данных.
4. Scikit-Learn Библиотека для машинного обучения.
5. Библиотеки Selenium и Beautiful Soup для сбора данных Instagram
6. Jupyter Notebook .
Полный набор данных и код можно загрузить на моем Github, и вся работа выполняется в Jupyter Notebook.
1 Получение данных от влиятельных лиц Instagram с помощью Selenium и Beautiful Soup.
Шаг 1 является наиболее трудоемким, поскольку получение данных влиятельных лиц в Instagram занимает много времени. Шаг 1 состоит из 3-х этапов:
1.1 Составьте список прогнозируемых влиятельных лиц. Я взял 1000 лидеров мнений из Индонезии (источник starngage ).
#Create Empty List ranking = [] username = [] category = [] category_2 = [] #Function to scrape username information def scrape_username(url): #accessing and parsing the input url response = requests.get(url) print(f'page {a} respose {response}') soup = BeautifulSoup(response.content, 'html.parser') list_username = soup.find_all('tr') #looping to the element that we want to scrape for p in list(list_username): try: #getting the information (rank, names, and category) rank = p.find('td', 'align-middle').get_text().strip() ranking.append(rank) name = p.find('a').get_text().strip() username.append(name) cat = p.find_all('span', 'badge badge-pill badge-light samll text-muted') category_2 = [] for c in cat: d = c.find('a', 'link').get_text() category_2.append(d) category.append(category_2) except: continue
1.2 Возьмите ссылки на публикации от каждого влиятельного лица в Instagram с помощью Selenium.
#Create Empty List link = [] names = [] #Function to get Post Link def get_influencer_link(username): #to influencer url url = f'https://www.instagram.com/{username}/' driver = webdriver.Chrome() driver.get(url) time.sleep(5) i = 0 while i < 8: try: #get the links pages = driver.find_elements_by_tag_name('a') for data in pages: data_2 = data.get_attribute("href") if '/p/' in data_2: link.append(data.get_attribute("href")) names.append(name) # Scroll down to bottom driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page time.sleep(1) i += 1 except: i += 1 continue driver.quit()
1.3. Получать информацию о каждом сообщении, такую как количество лайков, количество комментариев, подписей и т. д. с помощью Beautiful Soup.
#Create Empty List likes = [] comment_counts = [] dates = [] captions = [] type_posts = [] links = [] #Function to get information def get_information(link): try: global i, n #accessing and parsing the website url url = link response = requests.get(url) soup = BeautifulSoup(response.content) #find element that contain information body = soup.find('body') script = body.find('script') raw = script.text.strip().replace('window._sharedData =', '').replace(';', '') json_data=json.loads(raw) posts =json_data['entry_data']['PostPage'][0]['graphql'] posts= json.dumps(posts) posts = json.loads(posts) #acquiring information like = posts['shortcode_media']['edge_media_preview_like']['count'] comment_count = posts['shortcode_media']['edge_media_to_parent_comment']['count'] date = posts['shortcode_media']['taken_at_timestamp'] caption = posts['shortcode_media']['edge_media_to_caption']['edges'][0]['node']['text'] type_post = posts['shortcode_media']['__typename'] likes.append(like) comment_counts.append(comment_count) dates.append(date) captions.append(caption) type_posts.append(type_post) links.append(link) i += 1 except: i += 1 n += 1 print(f'number of link error {n} at iteration {i}') pass
2 Предварительная обработка данных начинается с очистки данных, разработки функций, выбора функций до тех пор, пока данные не будут готовы к использованию в модели машинного обучения.
Шаг 2 состоит из 3 этапов, а именно: очистка данных, разработка функций и выбор функций.
2.1 Очистка данных состоит из двух вещей, а именно преобразования формата даты, который все еще находится во времени эпохи, в дату и время, и очистки заголовков функций.
#convert epoch time --> datetime #The format is year-month-day-hour df['dates'] = df['dates'].apply(lambda x: dt.datetime.fromtimestamp(x).strftime('%Y-%m-%d-%H')) #remove unused characters in feature captions df['captions'] = df['captions'].replace(r'[\n]', '', regex=True) #fill missing value in features captions df['captions'] = df['captions'].fillna('no captions')
2.2 Этот шаг - разработка функций, на котором из 10 функций можно создать 52 новые функции. На этом этапе также была создана базовая таблица для процесса моделирования.
#create features lag of n_post (last 3 month) #number of n_post 1 months ago base_table['n_post_01'] = base_table.groupby(['username'])['n_post'].shift(1).fillna(0) #number of n_post 2 months ago base_table['n_post_02'] = base_table.groupby(['username'])['n_post'].shift(2).fillna(0) #number of n_post 3 months ago base_table['n_post_03'] = base_table.groupby(['username'])['n_post'].shift(3).fillna(0)
2.3 Следующий шаг - выбор функций, я все еще использую простой выбор функций. Я использую метод, чтобы посмотреть коэффициент корреляции между предиктором и целевыми функциями.
#I choose variables with the value of correlation coefficient r < -0.2 and r > 0.3 #it is very subjective matter plt.figure(figsize=(10,8)) sns.heatmap(df.corr());
Из 62 функций я взял только около 20, которые я буду использовать в процессе моделирования.
3 Моделирование использует алгоритм машинного обучения (Линейная регрессия, Случайный лес, XGBoost), а также выполняет некоторые настройки Гиперпараметров.
Я выполнил несколько сценариев в процессе моделирования с целью найти лучшую модель. Это сценарии:
1. Моделирование без выбора функций и без настройки гиперпараметров.
2. Моделирование без выбора функций и с настройкой гиперпараметров.
3. Моделирование с выбором функций и без настройки гиперпараметров.
4. Моделирование с выбором функций и с настройкой гиперпараметров.
Всего имеется 10 сценариев с их характеристиками по обучению данных, тестированию данных и обучению данных + тестированию данных. Оценка показателей, которую я использовал, относится только к среднеквадратичной ошибке (RMSE). Из всех сценариев Случайный лес с Выбором функций и с Настройкой гиперпараметров дает наилучший результат в перспективе, если обучение RMSE, тест RMSE и RMSE - все. Поэтому я выбрал эту модель в качестве окончательной для прогнозирования.
4 Интерпретация результатов прогнозных данных конечного машинного обучения модели.
Результаты прогнозов показывают, что в июле будет 513 влиятельных лиц в Instagram, средняя общая вовлеченность которых будет расти, а 123 будет снижаться .
Если мы посмотрим на результаты нашей «Важности лучших характеристик модели», а именно «Случайный лес», можно увидеть, что функции, связанные с лайками и обязательствами, имеют высокую относительную важность.
Наконец, также завершена статья, связанная с прогнозированием инфлюенсеров в Instagram. Если я могу сделать вывод, мы сделали несколько вещей:
1. Получение внешних данных из Instagram
2. Выполнение некоторой предварительной обработки данных
3. Моделирование с помощью алгоритма машинного обучения.
4. Интерпретация результатов
Я надеюсь, что эта статья может помочь читателям, и если есть предложения или комментарии, просто напишите их в колонках комментариев ниже.