JavaRush /Java Blog /Random-KO /Java 개발자를 위한 머신 러닝, 1부

Java 개발자를 위한 머신 러닝, 1부

Random-KO 그룹에 게시되었습니다
기계 학습 알고리즘을 설정하고 Java를 사용하여 첫 번째 예측 기능을 개발하세요. 자율주행차, 안면인식 시스템, 음성 비서 등은 모두 머신러닝 기술과 프레임워크를 사용하여 개발됩니다. 그리고 이것은 단지 첫 번째 물결일 뿐입니다. 향후 10년 동안 새로운 세대의 제품이 세상을 변화시켜 프로그램, 제품 및 애플리케이션 개발에 대한 새로운 접근 방식을 제시할 것입니다. Java 개발자를 위한 기계 학습, 1부 - 1Java 프로그래머로서 여러분은 기술 회사가 기계 학습에 막대한 투자를 시작하고 있는 지금 이러한 흐름을 따라가고 싶습니다. 오늘 배운 내용을 향후 5년 동안 사용할 수 있습니다. 하지만 어디서부터 시작해야 할까요? 이 글은 이 질문에 답하는 것을 목표로 합니다. 기계 학습 알고리즘 구현 및 준비에 대한 간단한 가이드를 따라가면 기계 학습 원리에 대한 첫인상을 얻을 수 있습니다. 학습 알고리즘의 구조와 이를 학습하고 평가하고 최고의 예측 정확도를 제공하는 기능을 선택하는 데 사용할 수 있는 기능에 대해 학습한 후 JVM 프레임워크(Weka)를 사용하여 다음 작업을 수행하는 방법을 이해하게 됩니다. 머신러닝 솔루션을 구축하세요. 이 기사에서는 스마트 애플리케이션 개발에 가장 일반적으로 사용되는 원리인 지도형 기계 학습에 중점을 둡니다.

머신러닝과 인공지능

머신러닝은 인간의 지능을 모방할 수 있는 기계를 만드는 것을 목표로 하는 인공지능 분야에서 발전했습니다. '머신러닝'이라는 용어는 컴퓨터 과학에서 유래했지만 인공지능은 새로운 과학 분야가 아닙니다. 20세기 초 수학자 앨런 튜링(Alan Turing)이 개발한 튜링 테스트(Turing test)는 컴퓨팅 기계가 진정한 지능을 가지고 있는지 판단하기 위해 고안된 최초의 테스트 중 하나입니다. 튜링 테스트에 따르면 컴퓨팅 기계는 사람이 기계와 대화하고 있다는 사실을 깨닫지 못한 채 사람을 가장하여 인간 지능의 존재를 증명합니다.
Java 개발자를 위한 기계 학습, 1부 - 2
오늘날 널리 사용되는 많은 기계 학습 접근 방식은 수십 년 전의 아이디어를 기반으로 합니다. 그러나 컴퓨팅(및 분산 컴퓨팅 플랫폼) 분야에서 지난 10년 동안 기계 학습 알고리즘을 적용할 수 있는 충분한 성능이 확보되었습니다. 대부분은 엄청난 양의 행렬 곱셈과 기타 수학적 계산이 필요합니다. 20년 전에는 그러한 계산을 가능하게 하는 컴퓨팅 기술이 존재하지 않았지만 이제는 현실이 되었습니다. 기계 학습 알고리즘을 통해 프로그램은 사람의 개입 없이 품질 개선 프로세스를 수행하고 기능을 확장할 수 있습니다. 기계 학습을 사용하여 개발된 프로그램은 자체 코드를 독립적으로 업데이트하거나 확장할 수 있습니다.

지도 학습과 비지도 학습

지도 학습과 비지도 학습은 기계 학습에 대한 가장 널리 사용되는 두 가지 접근 방식입니다. 두 가지 옵션 모두 관계를 구축하고 학습하기 위해 엄청난 양의 데이터 기록을 기계에 공급해야 합니다. 이렇게 수집된 데이터를 일반적으로 "특징 벡터" 라고 합니다 . 예를 들어, 특정 주거용 건물이 있습니다. 이 경우 특징 벡터에는 집의 전체 면적, 방 수, 집이 지어진 연도 등과 같은 특징이 포함될 수 있습니다. 지도 학습에서는 기계 학습 알고리즘이 특징 벡터와 관련된 질문에 답하도록 훈련됩니다. 알고리즘을 훈련하기 위해 일련의 특징 벡터와 관련 레이블이 제공됩니다. 관련 라벨은 개인(교사)이 제공하며 질문에 대한 올바른 "답변"을 포함합니다. 학습 알고리즘은 특징 벡터를 분석하고 라벨을 수정하여 내부 구조와 이들 사이의 관계를 찾습니다. 이런 식으로 기계는 질문에 올바르게 대답하는 방법을 학습합니다. 예를 들어, 부동산 거래를 위한 특정 지능형 애플리케이션을 고려해 볼 수 있습니다. 주택 세트의 크기, 방 수, 건축 연도를 포함한 특징 벡터를 사용하여 학습할 수 있습니다. 개인은 이러한 요소를 기반으로 각 주택에 정확한 주택 가격이 포함된 라벨을 할당해야 합니다. 이 데이터를 분석함으로써 스마트 애플리케이션은 "이 집을 살 수 있는 돈은 얼마나 될까요?"라는 질문에 대답하도록 스스로 훈련해야 합니다.
Java에 대해 읽고 싶으십니까? Java 개발자 그룹에 가입하세요 !
준비 과정이 완료되면 새로운 입력 데이터는 더 이상 표시되지 않습니다. 기계는 알 수 없고 레이블이 지정되지 않은 특징 벡터에 대해서도 질문에 정확하게 대답할 수 있어야 합니다. 비지도 학습에서 알고리즘은 사람이 라벨을 지정하지 않고(또는 질문을 하지 않고도) 답변을 예측하도록 설계되었습니다. 비지도 학습 알고리즘은 레이블이나 결과를 결정하는 대신 대규모 데이터 세트와 컴퓨팅 성능을 사용하여 이전에 알려지지 않은 관계를 발견합니다. 예를 들어, 소비재 마케팅에서는 비지도 학습을 사용하여 숨겨진 관계나 고객 그룹을 식별할 수 있으며, 이는 궁극적으로 마케팅 프로그램을 개선하거나 새로운 프로그램을 만드는 데 도움이 될 수 있습니다. 이 기사에서는 지도형 기계 학습에 중점을 둘 것입니다. 이는 현재 가장 일반적으로 사용되는 접근 방식입니다.

지도 머신러닝

모든 머신러닝은 데이터를 기반으로 합니다. 지도형 기계 학습 프로젝트의 경우 질문에 대한 의미 있는 답변을 제공하는 방식으로 데이터에 마커를 표시해야 합니다. 아래 표-1에서는 각 주택정보 레코드에 '주택가격'이라는 라벨이 붙어 있다. 기록 데이터와 주택 가격 사이의 관계를 식별함으로써 알고리즘은 결국 주어진 목록에 포함되지 않은 주택의 시장 가격을 예측할 수 있어야 합니다. (집의 면적은 평방 미터로 표시되고 집 가격은 유로로 표시됩니다.)
표 1. 주택 목록
징후 징후 징후 상표
주택 면적 객실 수 집의 나이 예상 집값
90m2/295피트 방 2개 23 살 €249,000
101m2 / 331피트 방 3개 해당 없음 €338,000
1330m2 / 4363피트 11개 객실 12 년 6,500,000€
초기 단계에서는 데이터에 수동으로 레이블을 지정하게 되지만 결국에는 프로그램이 자체적으로 레이블을 지정하도록 가르치게 됩니다. 이메일 클라이언트에서 이 접근 방식이 작동하는 것을 이미 보셨을 것입니다. 여기서 이메일을 스팸 폴더로 이동하려면 "이 이메일이 스팸인가요?"라는 질문에 대답해야 합니다. 답장을 하면 보고 싶지 않은 이메일을 인식하도록 프로그램을 훈련시킵니다. 애플리케이션의 스팸 필터는 동일한 소스에서 왔거나 동일한 콘텐츠를 포함하는 메시지를 표시하고 적절한 규칙에 따라 관리하도록 훈련되었습니다. 라벨이 지정된 데이터 세트는 준비 및 테스트 목적으로만 필요합니다. 이 단계가 완료되면 기계 학습 알고리즘이 레이블이 없는 데이터에 대해 작동합니다. 예를 들어, 예측 알고리즘에 주택에 대한 레이블이 지정되지 않은 새로운 데이터 기록을 제공할 수 있으며, 예비 데이터에서 얻은 "지식"을 기반으로 주택의 예상 가격을 자동으로 예측해야 합니다.

기계가 예측을 학습하는 방법

지도 머신러닝의 과제는 주어진 질문에 대한 적절한 예측 기능을 찾는 것입니다. 수학적으로 어려운 점은 변수를 입력으로 받아 х예측값을 반환하는 함수를 찾는 것입니다 у. 가설의 이러한 기능은 (hθ)준비 과정의 결과입니다. 종종 가설 함수는 목적 함수 또는 예측 함수라고도 합니다.
y = h θ (x)
대부분의 경우 х데이터 배열입니다. 이 예에서 이는 집을 정의하는 요소의 2차원 배열이며, 방 수와 집 면적으로 구성됩니다. 이러한 값의 배열이 특징 벡터입니다. 특정 목적 함수를 지정하면 이를 사용하여 각 특징 벡터를 예측할 수 있습니다 х. 주택 가격을 예측하려면 {101.0, 3.0}주택 면적과 방 수로 구성된 특징 벡터를 사용하여 목적 함수를 호출해야 합니다.
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
예제-1의 소스 코드에서 배열의 값은 х주택 특징의 벡터를 나타냅니다. 목적 함수에 의해 반환된 값은 у주택의 예측 가격입니다. 기계 학습의 목표는 알려지지 않은 입력 매개변수가 주어지면 최대한 정확하게 작동하는 목적 함수를 결정하는 것입니다. 기계 학습에서는 목적 함수를 (hθ)모델이라고도 합니다. 이 모델은 학습 과정의 결과입니다.
Java 개발자를 위한 기계 학습, 1부 - 3
레이블이 지정된 훈련 샘플을 기반으로 학습 알고리즘은 훈련 데이터에서 구조나 패턴을 찾습니다. 그래서 그는 일반적으로 데이터에 적합한 모델을 구축합니다. 일반적으로 학습 과정은 본질적으로 탐색적입니다. 대부분의 경우 프로세스는 학습 알고리즘과 구성의 다양한 변형을 사용하여 여러 번 반복됩니다. 결과적으로 모든 모델은 성능 지표를 기반으로 평가되며 그 중에서 가장 좋은 모델이 선택됩니다. 그리고 이 모델은 향후 태그가 지정되지 않은 데이터에 대한 추정값을 계산하는 데 사용됩니다.

선형 회귀

기계에게 "생각"하도록 가르치려면 먼저 사용할 학습 알고리즘을 선택해야 합니다. 예를 들어 선형 회귀입니다. 이는 가장 간단하고 널리 사용되는 지도형 기계 학습 알고리즘 중 하나입니다. 알고리즘은 입력 기능과 결과 마커 간의 관계가 선형이라고 가정합니다. θ 아래의 일반 선형 회귀 함수는 특징 벡터의 모든 요소에 매개변수 (theta) 를 곱하여 예측값을 반환합니다 . 이 매개변수는 훈련 프로세스 중에 훈련 데이터를 기반으로 회귀 함수를 조정하거나 "조정"하는 데 사용됩니다.
h θ (x) = θ 0 * 1 + θ 1 * x 1 + ... θ n * x n
선형 회귀 함수에서 세타 매개변수와 특징 매개변수는 아래 첨자로 번호가 지정됩니다. 아래 첨자는 벡터에서 매개변수 (θ)와 특징 매개변수 의 위치를 ​​결정합니다 . (х)x 0 특징 은 일정한 이동 항이며 1계산 목적에 중요합니다. 결과적으로 집의 면적과 같은 중요한 매개변수의 지수는 x 1 로 시작됩니다 . 따라서 x 1 에 특징 벡터의 첫 번째 값(집 면적)이 할당되면 x 2는 다음 값(방 수)을 취하게 됩니다. 예제-2는 수학적으로 h θ (x)로 표시되는 선형 회귀 함수의 Java 구현을 보여줍니다. 단순화를 위해 계산은 를 사용하여 수행됩니다 double. 메서드에서는 apply()배열의 첫 번째 요소가 1.0과 같고 이 함수 외부에서 설정되도록 제공됩니다. 예제 2: Java의 선형 회귀
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
새 인스턴스를 생성하려면 LinearRegressionFunction매개변수를 지정해야 합니다 θ. 이 매개변수 또는 벡터는 일반 선형 회귀 함수를 기본 훈련 데이터에 적용하는 데 사용됩니다. 프로그램에 사용되는 매개변수는 θ훈련 사례를 기반으로 훈련 과정 중에 조정됩니다. 훈련된 목표 함수의 품질은 훈련을 위해 준비된 데이터의 품질에 따라 달라집니다. 아래 예에서는 LinearRegressionFunction주택 크기를 기반으로 가격 예측을 사용하여 설명합니다. x 0 이 1.0 값을 갖는 상수여야 한다는 점을 고려하면, 목적 함수는 θ학습 과정의 결과인 두 개의 매개변수를 사용하여 초기화됩니다. 새로운 예시를 생성하면 면적이 1330제곱미터인 주택의 가격이 아래와 같이 예측됩니다.
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
아래 그림에서 예측 목적 함수(파란색 선)의 그래프를 볼 수 있습니다. 집 면적의 모든 값에 대한 목적 함수를 계산하여 얻습니다. 차트에는 훈련에 사용되는 가격-영역 쌍도 포함되어 있습니다.
Java 개발자를 위한 기계 학습, 1부 - 4
현재 예측 차트는 꽤 좋아 보입니다. 그래프의 좌표(위치 및 기울기)는 벡터에 의해 결정됩니다 θ { 1.004579, 5.286822 }. 하지만 θ귀하의 애플리케이션에 가장 적합한 벡터가 무엇인지 어떻게 결정할 수 있습니까? 첫 번째 또는 두 번째 매개변수를 변경하면 함수가 더 잘 맞을까요? 가장 적합한 세타 벡터를 결정하려면 목적 함수가 작업을 얼마나 잘 수행하는지 평가하는 유틸리티 함수가 필요합니다. 계속하려면 영어에서 번역 하세요. 저자: Gregor Roth, JavaWorld의 소프트웨어 설계자
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION