우리가 하는 많은 선택은 숫자 관계를 중심으로 이루어집니다.
- 과학에 따르면 콜레스테롤을 낮추는 특정 음식을 먹습니다.
- 우리는 급여가 인상될 가능성이 높기 때문에 교육을 계속합니다.
- 우리는 가치가 가장 높을 것으로 생각되는 동네에서 집을 구입합니다.
우리는 어떻게 이러한 결론에 도달합니까? 아마도 누군가가 많은 양의 데이터를 수집하여 결론을 내리는 데 사용했을 것입니다. 한 가지 일반적인 기술은 지도 학습의 한 형태인 선형 회귀입니다. 지도 학습에 대한 자세한 내용과 자주 사용되는 사례는 이 시리즈의 1부에서 확인하세요.
선형 관계
값이 두 개일 때 - x
라고 부릅니다. 및 y
— 선형 관계가 있다는 것은 x
를 변경한다는 의미입니다. 1은 항상 y
를 발생시킵니다. 일정 금액만큼 변경합니다. 예를 들어 설명하는 것이 더 쉽습니다.
- 10개의 피자는 한 개의 피자 가격의 10배입니다.
- 10피트 높이의 벽에는 5피트 벽보다 두 배의 페인트가 필요합니다.
수학적으로 이러한 종류의 관계는 선 방정식을 사용하여 설명됩니다.
y = mx + b
수학은 끔찍하게 혼란스러울 수 있지만 종종 나에게는 마술처럼 보입니다. 처음 선의 방정식을 배웠을 때, 하나의 공식으로 선의 거리, 기울기 및 기타 점을 계산할 수 있다는 것이 얼마나 아름다운지 생각했던 기억이 납니다.
하지만 데이터 포인트만 있으면 이 공식을 어떻게 얻을 수 있습니까? 정답은 선형 회귀입니다. 이는 매우 인기 있는 기계 학습 도구입니다.
선형 회귀의 예
이 게시물에서는 노래의 분당 비트 수(BPM)가 Spotify에서의 인기도를 예측하는지 살펴보겠습니다.
선형 회귀는 두 변수 간의 관계를 모델링합니다. 하나는 "설명 변수"라고 하고 다른 하나는 "종속 변수"라고 합니다.
이 예에서 BPM이 인기를 "설명"할 수 있는지 확인하고 싶습니다. 따라서 BPM은 설명 변수가 됩니다. 그것이 인기를 종속변수로 만든다.
모델은 최소 제곱 회귀를 사용하여 형식에 가장 적합한 라인을 찾습니다. y = mx + b
.
설명 변수가 여러 개 있을 수 있지만 이 예에서는 하나만 있는 단순 선형 회귀를 수행합니다.
최소제곱이란?
선형 회귀를 수행하는 방법에는 여러 가지가 있습니다. 그 중 하나는 "최소 제곱"입니다. 각 데이터 포인트에서 라인까지 수직 편차의 제곱의 합을 최소화하여 최적의 피팅 라인을 계산합니다.
혼란스럽게 들릴지 모르지만 기본적으로는 "해당 라인과 데이터 포인트 사이의 공간을 최소화하는 라인을 만드세요."라고 말하는 것입니다.
제곱 및 합산의 이유는 양수 값과 음수 값 사이에 취소가 없기 때문입니다.
다음은 설명을 잘하는 Quora에서 찾은 이미지입니다.
데이터 세트
Kaggle:https://www.kaggle.com/leonardopena/top50spotify2019에서 이 데이터 세트를 사용할 것입니다. CSV로 다운로드할 수 있습니다.
데이터 세트에는 16개의 열이 있습니다. 그러나 "트랙 이름", "분당 비트 수" 및 "인기"의 세 가지에만 관심이 있습니다. 머신 러닝의 가장 중요한 단계 중 하나는 데이터 형식을 적절하게 지정하는 것입니다. 이를 종종 "뭉침"이라고 합니다. 앞서 언급한 3개의 열을 제외한 모든 데이터를 삭제할 수 있습니다.
CSV는 다음과 같아야 합니다.
루비를 사용하여 회귀 분석
이 예에서는 ruby_linear_regression
을 사용할 것입니다. 보석. 설치하려면 다음을 실행하십시오.
gem install ruby_linear_regression
자, 코딩을 시작할 준비가 되었습니다! 새 Ruby 파일을 만들고 다음 요구 사항을 추가합니다.
require "ruby_linear_regression"
require "csv"
다음으로 CSV 데이터를 읽고 #shift
를 호출합니다. , 헤더 행을 삭제합니다. 또는 CSV 파일에서 첫 번째 행을 삭제할 수도 있습니다.
csv = CSV.read("top50.csv")
csv.shift
x-데이터 포인트와 y-데이터 포인트를 담기 위해 두 개의 빈 배열을 만들어 봅시다.
x_data = []
y_data = []
... 그리고 .each
를 사용하여 반복합니다. Beats Per Minute
를 추가하는 방법 x 배열에 대한 데이터 및 Popularity
데이터를 y 배열로 가져옵니다.
여기서 실제로 무슨 일이 일어나고 있는지 궁금하다면 row
를 기록하여 실험할 수 있습니다. puts
또는 p
. 예:puts row
csv.each do |row|
x_data.push( [row[1].to_i] )
y_data.push( row[2].to_i )
end
이제 ruby_linear_regression
을 사용할 차례입니다. 보석. 회귀 모델의 새 인스턴스를 만들고 데이터를 로드하고 모델을 학습시킵니다.
linear_regression = RubyLinearRegression.new
linear_regression.load_training_data(x_data, y_data)
linear_regression.train_normal_equation
다음으로 관찰된 값과 예측된 값 간의 차이를 측정한 평균 제곱 오차(MSE)를 인쇄합니다. 음수 값과 양수 값이 서로 상쇄되지 않도록 차이가 제곱됩니다. 우리는 예측 값과 실제 값 사이의 거리가 커지는 것을 원하지 않기 때문에 MSE를 최소화하려고 합니다.
puts "Trained model with the following cost fit #{linear_regression.compute_cost}"
마지막으로 컴퓨터가 우리 모델을 사용하여 예측하도록 합시다. 구체적으로, BPM이 250인 노래는 얼마나 인기가 있을까요? prediction_data
에서 다양한 값을 자유롭게 사용해 보세요. 정렬.
prediction_data = [250]
predicted_popularity = linear_regression.predict(prediction_data)
puts "Predicted popularity: #{predicted_popularity.round}"
결과
콘솔에서 프로그램을 실행하고 결과를 확인합시다!
➜ ~ ruby spotify_regression.rb
Trained model with the following cost fit 9.504882197447587
Predicted popularity: 91
시원한! "250"을 "50"으로 변경하고 우리 모델이 예측하는 것을 봅시다.
➜ ~ ruby spotify_regression.rb
Trained model with the following cost fit 9.504882197447587
Predicted popularity: 86
분당 비트 수가 많은 노래가 더 인기가 있는 것 같습니다.
전체 프로그램
내 전체 파일은 다음과 같습니다.
require 'csv'
require 'ruby_linear_regression'
x_data = []
y_data = []
csv = CSV.read("top50.csv")
csv.shift
# Load data from CSV file into two arrays -- one for independent variables X (x_data) and one for the dependent variable y (y_data)
# Row[0] = title
# Row[1] = BPM
# Row[2] = Popularity
csv.each do |row|
x_data.push( [row[1].to_i] )
y_data.push( row[2].to_i )
end
# Create regression model
linear_regression = RubyLinearRegression.new
# Load training data
linear_regression.load_training_data(x_data, y_data)
# Train the model using the normal equation
linear_regression.train_normal_equation
# Output the cost
puts "Trained model with the following cost fit #{linear_regression.compute_cost}"
# Predict the popularity of a song with 250 BPM
prediction_data = [250]
predicted_popularity = linear_regression.predict(prediction_data)
puts "Predicted popularity: #{predicted_popularity.round}"
다음 단계
이것은 매우 간단한 예이지만 그럼에도 불구하고 기계 학습에 사용되는 핵심 기술인 첫 번째 선형 회귀를 실행했습니다. 더 많은 것을 원하신다면 다음에 할 수 있는 몇 가지 다른 작업이 있습니다. - 내부에서 수학이 일어나는 것을 보기 위해 사용했던 Ruby gem의 소스 코드를 확인하세요. - 원래 데이터 세트로 돌아가서 시도해 보세요. 모델에 추가 변수를 추가하고 다변수 선형 회귀를 실행하여 MSE를 줄일 수 있는지 확인합니다. 예를 들어 "valence"(노래가 얼마나 긍정적인지)도 인기에 한몫을 합니다. - ruby_linear_regression
을 사용하여 실행할 수도 있는 경사하강법 모델을 사용해 보십시오. 보석.