trybeetle

take it slow!!

Regulationの導入について


Posted on July 17, 2018, 9:48 p.m.



Overfitting時のRegulationの導入方法について記載します。
CourseraのMachine Learningコースを元にしています。

トレーニングデータに合わせすぎた複雑な多項式(polynomial)を定義した場合、データありきのDecision Boundaryとなり、正しく分類できないことがあります。
Regulationにより、その問題を解決することができます。Lambda(λ)を導入することで、θ重みを軽減し、データありきの結果(overfitting)とならないようにします。


トレーニングデータの読み込み

まずは、トレーニングデータのDatasetを読み込みます。Xをfeatureとし、yをlabelとします。mはDatasetの数。Datasetの内容としては、Test1の結果、Test2の結果、合否の結果(0が不合格、1が合格)です。(例:0.051267,0.69956,1)


%% Load Data
data = load('ex2data2.txt');
X = data(:, 1:2);
y = data(:, 3);
m = length(y);

データがどのように分布しているかグラフ化し確認します。


% plotData関数の定義
function plotData(X, y)
figure; hold on;
pos = find(y==1);
neg = find(y == 0);
plot(X(pos, 1), X(pos, 2), 'k+','LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7);
xlabel('Microchip Test 1')
ylabel('Microchip Test 2')
legend('y = 1', 'y = 0')
hold off;
end

% 関数の実行
plotData(X, y);

多項式(polynomial)の定義

今回の多項式は、最大で6乗となるような、多項式を定義します。


% mapFeature関数の定義
function out = mapFeature(X1, X2)
degree = 6;
out = ones(size(X1(:,1)));
for i = 1:degree
    for j = 0:i
        out(:, end+1) = (X1.^(i-j)).*(X2.^j);
    endfor
endfor
end

% 関数の実行
X = mapFeature(X(:,1), X(:,2));

Cost functionの定義

θとlamdaの初期値を設定します。


initial_theta = zeros(size(X, 2), 1);
lambda = 1;

hypothesisの値を0 or 1で求めるため、sigmoid関数を使用します。


function g = sigmoid(z)
g = zeros(size(z));
g = 1 ./ (1 + e.^-z);
end

cost functionを定義します。


function [J, grad] = costFunctionReg(theta, X, y, lambda)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));
h_theta = sigmoid(X * theta);
reg = 1/(2*m) * ((theta)' * theta - theta(1)^2);
J = (1/m * ((-y' * log(h_theta)) - ((1 - y)' * log(1 - h_theta)))) + (lambda * reg);
mask = ones(size(theta));
mask(1) = 0;
grad = 1/m * ((h_theta - y)' * X)' + lambda / m * (theta .* mask);
end

Logistic Regressionの実行

octaveのfminunc関数を使用し、θの値を最適化します。
fminuncのオプションを指定し、実行します。


options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);

Decision Boundaryの表示

上記で求めたθで、0と1の境界線を表示させます。


% plotDecisionBoundary関数の定義
function plotDecisionBoundary(theta, X, y)
plotData(X(:,2:3), y);
hold on
if size(X, 2) <= 3
    % Only need 2 points to define a line, so choose two endpoints
    plot_x = [min(X(:,2))-2,  max(X(:,2))+2];

    % Calculate the decision boundary line
    plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));

    % Plot, and adjust axes for better viewing
    plot(plot_x, plot_y)

    % Legend, specific for the exercise
    legend('Admitted', 'Not admitted', 'Decision Boundary')
    axis([30, 100, 30, 100])
else
    % Here is the grid range
    u = linspace(-1, 1.5, 50);
    v = linspace(-1, 1.5, 50);

    z = zeros(length(u), length(v));
    % Evaluate z = theta*x over the grid
    for i = 1:length(u)
        for j = 1:length(v)
            z(i,j) = mapFeature(u(i), v(j))*theta;
        end
    end
    z = z'; % important to transpose z before calling contour

    % Plot z = 0
    % Notice you need to specify the range [0, 0]
    contour(u, v, z, [0, 0], 'LineWidth', 2)
endif
xlabel('Microchip Test 1')
ylabel('Microchip Test 2')
legend('y = 1', 'y = 0', 'Decision boundary')
hold off
end

% 関数の実行
plotDecisionBoundary(theta, X, y);

Lamdaの値を変化させて、もう一度plotさせます。
lamda=0の場合


lambda = 0;
options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);
plotDecisionBoundary(theta, X, y);

lamda=100の場合


lambda = 100;
options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, J, exit_flag] = fminunc(@(t)(costFunctionReg(t, X, y, lambda)), initial_theta, options);
plotDecisionBoundary(theta, X, y);

lamda=0の場合、つまりregulationをせずにpolynomialなhypothesisを定義した場合、overfittingをおこします。
一方で、lamda=100の場合、大きすぎる値にした場合は、underfitttingを起こします。


確認

Test1が0.3、Test2が0.6の場合の、合否を予測します。


prob = sigmoid(mapFeature(0.3,0.6) * theta);

また、このモデルのaccuracyは下記の様に求めます。


% predict関数の定義
function accuracy = predict(theta, X, y)
m = size(X, 1); % Number of training examples
p = round(sigmoid(X * theta));
accuracy = mean(double(p == y)) * 100;
end

% 関数の実行
accuracy = predict(theta, X, y);

以上、Regulationの導入についてでした。


Category:ML
Tag: ML Octave
July 17, 2018, 9:48 p.m.

Comments