python 알고리즘 연습One Rule 알고리즘(상세 설명)

4445 단어 pythononerule
이러한 특징 은 0 과 1 두 가지 수치 만 있 고 데이터 세트 는 세 가지 유형 이 있다.0 을 취 할 때 만약 에 유형 A 에 20 개의 이런 개체 가 있다 면 유형 B 는 60 개의 이런 개체 가 있 고 유형 C 는 20 개의 이런 개체 가 있다.따라서 이 특징 이 0 일 때 가장 가능성 이 높 은 것 은 유형 B 이지 만 40 개의 개체 가 B 유형 에 없 기 때문에 이 특징 을 유형 B 로 나 누 는 오류 율 은 40%이다.그 다음 에 모든 특징 을 통계 하고 모든 특징 오류 율 을 계산 한 다음 에 오류 율 이 가장 낮은 특징 을 유일한 분류 준칙 으로 선택 하 는 것 이 바로 OneR 이다.
지금 은 코드 로 알고리즘 을 실현 합 니 다.

# OneR    
import numpy as np
from sklearn.datasets import load_iris
#   iris   
dataset = load_iris()
#   iris     data  (      )
X = dataset.data
#   iris     target  (      )
y_true = dataset.target
#            
attribute_means = X.mean(axis=0)
#       ,      “1”,    “0”.                 。
x = np.array(X >= attribute_means, dtype="int")


from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y_true, random_state=14)
from operator import itemgetter
from collections import defaultdict
#                  。
def train_feature_class(x, y_true, feature_index, feature_values):
  num_class = defaultdict(int)
  for sample, y in zip(x, y_true):
    if sample[feature_index] == feature_values:
      num_class[y] += 1
  #     ,       。       
  sorted_num_class = sorted(num_class.items(), key=itemgetter(1), reverse=True)
  most_frequent_class = sorted_num_class[0][0]
  error = sum(value_num for class_num , value_num in sorted_num_class if class_num != most_frequent_class)
  return most_frequent_class, error
# print train_feature_class(x_train, y_train, 0, 1)
#                 ,             ,                。
def train_feature(x, y_true, feature_index):
  n_sample, n_feature = x.shape
  assert 0 <= feature_index < n_feature
  value = set(x[:, feature_index])
  predictors = {}
  errors = []
  for current_value in value:
    most_frequent_class, error = train_feature_class(x, y_true, feature_index, current_value)
    predictors[current_value] = most_frequent_class
    errors.append(error)
  total_error = sum(errors)
  return predictors, total_error
#                ,    :{0:({0: 0, 1: 2}, 41)}       ,         ,           ,                 ,        ,       ,            。
all_predictors = {feature: train_feature(x_train, y_train, feature) for feature in xrange(x_train.shape[1])}
# print all_predictors
#               
errors = {feature: error for feature, (mapping, error) in all_predictors.items()}
#       ,              ,        。   one Rule(OneR)  。
best_feature, best_error = sorted(errors.items(), key=itemgetter(1), reverse=False)[0]
# print "The best model is based on feature {0} and has error {1:.2f}".format(best_feature, best_error)
# print all_predictors[best_feature][0]
#     
model = {"feature": best_feature, "predictor": all_predictors[best_feature][0]}
# print model
#     ――                  。
def predict(x_test, model):
  feature = model["feature"]
  predictor = model["predictor"]
  y_predictor = np.array([predictor[int(sample[feature])] for sample in x_test])
  return y_predictor

y_predictor = predict(x_test, model)
# print y_predictor
#         ,                  ,     。
accuracy = np.mean(y_predictor == y_test) * 100
print "The test accuracy is {0:.2f}%".format(accuracy)

from sklearn.metrics import classification_report

# print(classification_report(y_test, y_predictor))
결론:OneR 알고리즘 은 처음에 오류 율 이 가장 낮은 특징 을 찾 은 후에 모든 특징의 분 류 를 판단 할 수 있다 고 생각 했 습 니 다.사실은 지금 은 이 특징 에서 의 각 특징 값 의 분류 만 판단 할 수 있다 는 것 을 알 기 때문에 한계 가 있 을 것 입 니 다.그냥 빠 르 고 간단명료 하 다 고.하지만 상황 에 따라 사용 여 부 를 판단 해 야 한다.
class      precision recall f1-score support
0              0.94     1.00    0.97       17
1              0.00     0.00    0.00       13
2              0.40     1.00    0.57        8
avg / total 0.51     0.66    0.55       38
주:
\#위 코드 에 있 습 니 다.
for sample in x_test:
print sample[0]
\#얻 은 것 은 xtest 의 첫 번 째 열 데이터.아래 코드 로 얻 은 것 은 x테스트 의 첫 줄 데이터.
print x_test[0]
\#차이 점 주의
이상 이 python 알고리즘 연습One Rule 알고리즘(상세 설명)은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 많은 응원 부 탁 드 리 겠 습 니 다.

좋은 웹페이지 즐겨찾기