>  기사  >  백엔드 개발  >  Python 및 Scikit-Learn을 사용한 기계 학습 탐색에 대한 자세한 설명

Python 및 Scikit-Learn을 사용한 기계 학습 탐색에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-17 10:24:291776검색

이 글은 주로 Python과 Scikit-Learn을 기반으로 한 머신러닝 탐색 관련 내용을 소개합니다. 편집자는 그것이 도움이 필요한 친구들의 학습과 참고를 위해 모두에게 공유한다고 생각합니다.

안녕하세요, %username% 님!

제 이름은 Alex이고 머신러닝과 네트워크 그래프 분석(주로 이론) 분야의 경험이 있습니다. 저는 또한 러시아 이동통신사를 위한 빅데이터 제품을 개발하고 있었습니다. 온라인에 글을 쓰는 것은 이번이 처음이므로 마음에 들지 않으면 댓글을 달지 마세요.

요즘에는 효율적인 알고리즘을 개발하고 머신러닝 대회에 참가하고 싶어하는 사람들이 많습니다. 그래서 그들은 나에게 와서 "어떻게 시작하나요?"라고 묻습니다. 얼마 전 러시아 정부 산하 기관에서 미디어와 소셜 네트워크용 빅데이터 분석 도구 개발을 주도한 적이 있습니다. 아직 우리 팀에서 사용하고 있는 문서 중 일부를 여러분과 공유하고 싶습니다. 전제 조건은 독자가 이미 수학과 기계 학습에 대한 충분한 지식을 가지고 있다는 것입니다(저희 팀은 주로 MIPT(모스크바 물리 기술 대학) 및 데이터 분석 학교 졸업생으로 구성되어 있습니다).

이 기사는 데이터 과학에 대한 소개입니다. 이 주제는 최근 매우 인기가 있습니다. 또한 기계 학습 대회(예: Kaggle, TudedIT)의 수가 증가하고 있으며 자금이 상당한 경우가 많습니다.

R과 Python은 데이터 과학자가 가장 일반적으로 사용하는 두 가지 도구입니다. 각 도구에는 장단점이 있지만 최근에는 Python이 모든 측면에서 승리하고 있습니다(두 가지를 모두 사용하지만 저의 겸손한 의견입니다). 이 모든 일은 완전한 문서와 풍부한 기계 학습 알고리즘을 포함하는 Scikit-Learn 라이브러리의 출현으로 인해 발생했습니다.
이 기사에서는 주로 기계 학습 알고리즘에 대해 논의할 예정입니다. 일반적으로 마스터 데이터 분석을 수행하려면 Pandas 패키지를 사용하는 것이 더 좋으며 직접 수행하는 것도 쉽습니다. 따라서 구현에 중점을 두겠습니다. 확실성을 위해 *.csv 파일에 저장되는 특징-객체 행렬이 입력으로 있다고 가정합니다.

데이터 로딩

먼저 데이터를 메모리에 로드해야 연산이 가능합니다. Scikit-Learn 라이브러리는 구현 시 NumPy 배열을 사용하므로 NumPy를 사용하여 *.csv 파일을 로드합니다. UCI Machine Learning Repository에서 데이터세트 중 하나를 다운로드해 보겠습니다.


import numpy as np
import urllib
# url with dataset
url = “http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data”
# download the file
raw_data = urllib.urlopen(url)
# load the CSV file as a numpy matrix
dataset = np.loadtxt(raw_data, delimiter=“,”)
# separate the data from the target attributes
X = dataset[:,0:7]
y = dataset[:,8]

아래의 모든 예제에서는 이 데이터 세트를 사용합니다. 즉, X 기능 배열과 y 대상 변수의 값을 사용합니다.

데이터 정규화

우리 모두는 대부분의 경사 방법(거의 모든 기계 학습 알고리즘이 이를 기반으로 함)이 데이터 크기 조정에 민감하다는 것을 알고 있습니다. 따라서 알고리즘을 실행하기 전에 정규화, 즉 정규화를 수행해야 합니다. 표준화에는 모든 기능의 명목 값을 각각 0과 1 사이의 값을 갖도록 대체하는 작업이 포함됩니다. 정규화의 경우 각 특성 값이 0과 1의 분산을 갖도록 데이터를 전처리하는 작업이 포함됩니다. Scikit-Learn 라이브러리는 이에 상응하는 기능을 제공했습니다.


from sklearn
import metrics
from sklearn.ensemble
import ExtraTreesClassifier
model = ExtraTreesClassifier()
model.fit(X, y)# display the relative importance of each attribute
print(model.feature_importances_)

기능 선택

문제를 해결하는 데 가장 중요한 것은 기능을 적절하게 선택하거나 기능을 만드는 능력이라는 점에는 의심의 여지가 없습니다. 이를 특성 선택 및 특성 엔지니어링이라고 합니다. 기능 엔지니어링은 때로는 직관과 전문 지식에 더 많이 의존하는 매우 창의적인 프로세스이지만 기능 선택에 직접 사용할 수 있는 알고리즘은 이미 많이 있습니다. 예를 들어, 트리 알고리즘은 특징의 정보 내용을 계산할 수 있습니다.


from sklearn
import metrics
from sklearn.ensemble
import ExtraTreesClassifier
model = ExtraTreesClassifier()
model.fit(X, y)# display the relative importance of each attribute
print(model.feature_importances_)

다른 모든 방법은 최상의 하위 집합을 찾기 위한 기능 하위 집합의 효율적인 검색을 기반으로 합니다. 즉, 진화된 모델이 이 하위 집합에서 최고의 품질을 갖는다는 의미입니다. RFE(Recursive Feature Elimination)는 이러한 검색 알고리즘 중 하나이며 Scikit-Learn 라이브러리에서도 제공됩니다.


from sklearn.feature_selection
import RFE
from sklearn.linear_model
import LogisticRegression
model = LogisticRegression()# create the RFE model and select 3 attributes
rfe = RFE(model, 3)
rfe = rfe.fit(X, y)# summarize the selection of the attributes
print(rfe.support_)
print(rfe.ranking_)

알고리즘 개발

내가 말했듯이 Scikit-Learn 라이브러리는 모든 기본 기계 학습 알고리즘을 구현했습니다. 그 중 일부를 살펴보겠습니다.

로지스틱 회귀

는 분류 문제(이진 분류)를 해결하는 데 가장 많이 사용되지만 다중 클래스 분류(소위 일대다 방법)도 적합합니다. 이 알고리즘의 장점은 각 출력 객체에 대해 해당 카테고리의 확률이 있다는 것입니다.


from sklearn
import metrics
from sklearn.linear_model
import LogisticRegression
model = LogisticRegression()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

Naive Bayes

또한 가장 유명한 기계 학습 알고리즘 중 하나이며 주요 작업은 훈련 샘플의 데이터 분포 밀도를 복원하는 것입니다. 이 방법은 일반적으로 다중 클래스 분류 문제에서 잘 수행됩니다.


from sklearn
import metrics
from sklearn.naive_bayes
import GaussianNB
model = GaussianNB()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

k-nearest neighbor

kNN(k-nearest neighbor) 방법은 더 복잡한 분류 알고리즘의 일부로 자주 사용됩니다. 예를 들어, 추정된 값을 객체의 특징으로 사용할 수 있습니다. 때로는 간단한 kNN


from sklearn
import metrics
from sklearn.neighbors
import KNeighborsClassifier# fit a k - nearest neighbor model to the data
model = KNeighborsClassifier()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

결정 트리

分类和回归树(CART)经常被用于这么一类问题,在这类问题中对象有可分类的特征且被用于回归和分类问题。决策树很适用于多类分类。


from sklearn
import metrics
from sklearn.tree
import DecisionTreeClassifier# fit a CART model to the data
model = DecisionTreeClassifier()
model.fit(X, y)
print(model)# make predictions
expected = y
predicted = model.predict(X)# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

支持向量机

SVM(支持向量机)是最流行的机器学习算法之一,它主要用于分类问题。同样也用于逻辑回归,SVM在一对多方法的帮助下可以实现多类分类。


from sklearn import metrics
from sklearn.svm import SVC
# fit a SVM model to the data
model = SVC()
model.fit(X, y)
print(model)
# make predictions
expected = y
predicted = model.predict(X)
# summarize the fit of the model
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))

除了分类和回归问题,Scikit-Learn还有海量的更复杂的算法,包括了聚类, 以及建立混合算法的实现技术,如Bagging和Boosting。

如何优化算法的参数

在编写高效的算法的过程中最难的步骤之一就是正确参数的选择。一般来说如果有经验的话会容易些,但无论如何,我们都得寻找。幸运的是Scikit-Learn提供了很多函数来帮助解决这个问题。

作为一个例子,我们来看一下规则化参数的选择,在其中不少数值被相继搜索了:


import numpy as np
from sklearn.linear_model
import Ridge
from sklearn.grid_search
import GridSearchCV# prepare a range of alpha values to test
alphas = np.array([1, 0.1, 0.01, 0.001, 0.0001, 0])# create and fit a ridge regression model, testing each alpha
model = Ridge()
grid = GridSearchCV(estimator = model, param_grid = dict(alpha = alphas))
grid.fit(X, y)
print(grid)# summarize the results of the grid search
print(grid.best_score_)
print(grid.best_estimator_.alpha)

有时候随机地从既定的范围内选取一个参数更为高效,估计在这个参数下算法的质量,然后选出最好的。


import numpy as np
from scipy.stats
import uniform as sp_rand
from sklearn.linear_model
import Ridge
from sklearn.grid_search
import RandomizedSearchCV# prepare a uniform distribution to sample
for the alpha parameter
param_grid = {‘
  alpha': sp_rand()
}#
create and fit a ridge regression model, testing random alpha values
model = Ridge()
rsearch = RandomizedSearchCV(estimator = model, param_distributions = param_grid, n_iter = 100)
rsearch.fit(X, y)
print(rsearch)# summarize the results of the random parameter search
print(rsearch.best_score_)
print(rsearch.best_estimator_.alpha)

至此我们已经看了整个使用Scikit-Learn库的过程,除了将结果再输出到一个文件中。这个就作为你的一个练习吧,和R相比Python的一大优点就是它有很棒的文档说明。

总结

위 내용은 Python 및 Scikit-Learn을 사용한 기계 학습 탐색에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.