Шаг за шагом, чтобы спрогнозировать вовлеченность влиятельных лиц Instagram от получения данных Instagram до прогнозирования с помощью машинного обучения

В последние несколько недель я пытался создать мини-проект по науке о данных, связанный с машинным обучением. После долгих раздумий я, наконец, решил создать модель машинного обучения, которая может предсказать, будет ли взаимодействие с влиятельными лицами в Instagram расти или снижаться в в следующем месяце. Этот мини-проект является сквозным проектом, и эта статья будет разделена на 4 раздела, а именно:

  1. Получение данных от влиятельных лиц Instagram с помощью Selenium и Beautiful Soup.
  2. Предварительная обработка данных начинается с очистки данных, разработки функций, выбора функций и т. Д. До тех пор, пока данные не будут готовы к использованию в модели машинного обучения.
  3. При моделировании используется алгоритм машинного обучения (Линейная регрессия, Случайный лес, XGBoost), а также выполняется некоторая настройка гиперпараметров.
  4. Интерпретация результатов прогнозов машинного обучения.


Так что после прочтения этой статьи я надеялся, что читатель сможет получить некоторые знания, связанные с получением внешних данных, предварительной обработкой данных и моделью машинного обучения. И готовы начать свой собственный учебный проект 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. Интерпретация результатов

Я надеюсь, что эта статья может помочь читателям, и если есть предложения или комментарии, просто напишите их в колонках комментариев ниже.

Получите доступ к экспертному обзору - Подпишитесь на DDI Intel