LIME: 국소 해석 가능한 모델 불문 설명
LIME을 적용해 이미지 분류기와 텍스트 분류기를 설명하고, 어떤 픽셀이나 단어가 예측을 이끌었는지 보여 주는 국소 선형 근사치를 생성하는 방법을 학습합니다.
LIME: 국소 해석 가능한 모델 불문 설명은(는) CoddyKit의 무료 Machine Learning Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Machine Learning Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Machine Learning Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
LIME: The Core Idea
LIME (Local Interpretable Model-Agnostic Explanations) explains individual predictions of any black-box model by approximating it locally with a simple, interpretable model. The insight is that even if a neural network or ensemble is globally complex, its behaviour near a single input can often be well-approximated by a linear model. LIME is model-agnostic: it works with any classifier or regressor through its prediction function alone.
The LIME Algorithm Step by Step
LIME follows three steps for each prediction to explain: (1) Perturb the input sample by creating many slightly modified copies; (2) Query the black-box model for predictions on all perturbed samples; (3) Fit a weighted linear model where samples closer to the original get higher weights. The coefficients of this linear surrogate are the explanation.
# Conceptual pseudocode for LIME
def lime_explain(instance, model, n_samples=5000):
perturbed = perturb_around(instance, n=n_samples)
predictions = model.predict_proba(perturbed)
weights = kernel(distance(perturbed, instance))
surrogate = LinearRegression()
surrogate.fit(perturbed, predictions, sample_weight=weights)
return surrogate.coef_ # these are the LIME explanationsInstalling the lime Library
Install the lime package with pip install lime. The library provides specialised explainers for different data modalities: lime.lime_tabular.LimeTabularExplainer for structured tabular data, lime.lime_text.LimeTextExplainer for documents and sentences, and lime.lime_image.LimeImageExplainer for images. Each adapts the perturbation strategy to match the domain.
import lime
import lime.lime_tabular
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
data.data, data.target, test_size=0.2, random_state=42
)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)LimeTabularExplainer for Tabular Data
Create a LimeTabularExplainer using the training data to learn the feature distributions for perturbation. Provide feature names, class names, and set discretize_continuous=True to bin continuous features into human-readable ranges like 'radius <= 13.1'. This makes the surrogate model coefficients directly readable as rule-like conditions.
explainer = lime.lime_tabular.LimeTabularExplainer(
X_train,
feature_names=list(data.feature_names),
class_names=list(data.target_names),
discretize_continuous=True,
mode='classification'
)
# Explain a single test instance
instance = X_test[0]
explanation = explainer.explain_instance(
instance,
model.predict_proba,
num_features=10,
num_samples=5000
)Reading the Tabular Explanation
The explanation lists feature conditions and their weights. A positive weight means the condition supports the predicted class; a negative weight means it contradicts it. For example, 'worst radius <= 16.8 (weight=0.32)' means that having a small worst radius strongly favours predicting the benign class. Call explanation.as_list() to get these as a Python list of (condition, weight) tuples.
# Print top features with their weights
for feature, weight in explanation.as_list():
direction = 'supports' if weight > 0 else 'contradicts'
print(f'{feature}: weight={weight:.3f} ({direction} predicted class)')
# Or display as a matplotlib bar chart
explanation.as_pyplot_figure(label=1)
import matplotlib.pyplot as plt
plt.tight_layout()
plt.savefig('lime_tabular.png', dpi=150)LimeTextExplainer for Text Data
For text classification, LIME perturbs the input by randomly hiding words and observing how the prediction changes. Words that, when removed, cause the prediction to drop significantly receive high positive weights. This identifies the most influential words for the predicted label, making it easy to audit a spam filter or sentiment classifier for spurious patterns.
from lime.lime_text import LimeTextExplainer
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
# Toy spam pipeline
text_pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', MultinomialNB())
])
reviews = ['great product fast shipping', 'buy now click here free money']
labels = [0, 1] # 0=ham, 1=spam
text_pipeline.fit(reviews, labels)
text_explainer = LimeTextExplainer(class_names=['ham', 'spam'])
exp = text_explainer.explain_instance(
'free fast money click',
text_pipeline.predict_proba,
num_features=6
)
print(exp.as_list())LimeImageExplainer for Images
For images, LIME segments the image into superpixels (coherent regions) using SLIC and randomly masks groups of superpixels. The linear surrogate identifies which superpixels most influenced the prediction. This reveals whether the CNN is looking at the dog's face or the grass background. Call get_image_and_mask to produce an annotated overlay.
from lime.lime_image import LimeImageExplainer
from skimage.segmentation import mark_boundaries
import numpy as np
image_explainer = LimeImageExplainer()
# Assume 'img' is a (224, 224, 3) numpy array and 'cnn_predict' wraps the model
# exp = image_explainer.explain_instance(
# img, cnn_predict, top_labels=1, hide_color=0, num_samples=1000
# )
# image, mask = exp.get_image_and_mask(
# exp.top_labels[0], positive_only=True, num_features=5
# )
# plt.imshow(mark_boundaries(image, mask))
print('Image explainer segments image into superpixels and identifies key regions.')LIME vs SHAP: Key Differences
Both LIME and SHAP explain individual predictions, but they differ in important ways. LIME is faster, more customisable, and works naturally with text and images, but its explanations can vary between runs because perturbation is random. SHAP provides mathematically consistent explanations with the efficiency axiom, but TreeSHAP is only exact for tree models and KernelSHAP can be slow on large feature sets.
# Summary comparison
comparison = {
'LIME': {
'consistency': 'Random — varies between runs',
'speed': 'Moderate (5k perturbations)',
'modalities': 'Tabular, text, image',
'axioms_satisfied': False
},
'SHAP': {
'consistency': 'Exact for TreeExplainer',
'speed': 'Fast (TreeSHAP), slow (KernelSHAP)',
'modalities': 'Tabular, text, image (DeepSHAP)',
'axioms_satisfied': True
}
}
for method, props in comparison.items():
print(method, props)Stability: Increasing num_samples
LIME's explanations are stochastic because they depend on random perturbations. Increasing num_samples from the default 5000 reduces variance at the cost of more model calls. To test stability, run explain_instance multiple times with the same input and compare the top-5 feature weights. If rankings shift dramatically, increase num_samples or reduce the neighbourhood width via the kernel_width parameter.
import numpy as np
weights_runs = []
for seed in range(5):
np.random.seed(seed)
exp = explainer.explain_instance(
instance, model.predict_proba,
num_features=5, num_samples=5000
)
weights_runs.append(dict(exp.as_list()))
# Check variance across runs for top feature
top_feature = exp.as_list()[0][0]
vals = [run.get(top_feature, 0) for run in weights_runs]
print(f'Top feature weight std across 5 runs: {np.std(vals):.4f}')Using Explanations to Detect Model Bugs
LIME is a powerful debugging tool. If a sentiment classifier marks a review positive because of the word 'not' (the negation that should flip sentiment), LIME will reveal the word 'not' as a strong positive contributor — exposing the bug. Similarly, a medical classifier relying on 'hospital name' rather than clinical features can be caught by LIME before it enters production.
# Example: checking a suspicious prediction
suspect_text = 'I do not recommend this product at all'
exp = text_explainer.explain_instance(
suspect_text,
text_pipeline.predict_proba,
num_features=5
)
for word, weight in exp.as_list():
print(f' word={word!r:15} weight={weight:+.3f}')
# If 'not' has positive weight for positive sentiment class,
# the model has learned a spurious pattern.Integrating LIME into a Review Workflow
A practical pattern is to run LIME automatically on all high-confidence but counter-intuitive predictions: cases where the model is very confident but the ground truth label is wrong, or where a domain expert disagrees. Logging these explanations alongside predictions creates an audit trail for compliance and helps identify systematic biases before they affect users.
# Automated explanation logging for high-confidence errors
for i, (pred, true) in enumerate(zip(model.predict(X_test), y_test)):
confidence = model.predict_proba(X_test[i:i+1]).max()
if pred != true and confidence > 0.9:
exp = explainer.explain_instance(
X_test[i], model.predict_proba, num_features=5
)
print(f'Sample {i}: predicted={data.target_names[pred]}, '
f'true={data.target_names[true]}, conf={confidence:.2f}')
for feat, w in exp.as_list()[:3]:
print(f' {feat}: {w:+.3f}')Quick Check
Test your understanding of Machine Learning with Python concepts from this lesson.
Lesson Recap
In this lesson you learned: LIME approximates any black-box model locally with a weighted linear surrogate by perturbing the input and querying predictions, specialised explainers handle tabular, text, and image data with domain-appropriate perturbation strategies, and LIME can expose model bugs and biases by revealing which features or words drove a specific prediction. Next up we examine fairness metrics to measure and audit discriminatory model behaviour.
자주 묻는 질문
“LIME: 국소 해석 가능한 모델 불문 설명” 강의는 무료인가요?
네 — “LIME: 국소 해석 가능한 모델 불문 설명” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Machine Learning Academy 강의 전체를 잠금 해제할 수 있습니다. Machine Learning Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“LIME: 국소 해석 가능한 모델 불문 설명”에서 뭘 배우나요?
LIME을 적용해 이미지 분류기와 텍스트 분류기를 설명하고, 어떤 픽셀이나 단어가 예측을 이끌었는지 보여 주는 국소 선형 근사치를 생성하는 방법을 학습합니다. 브라우저에서 직접 실행하는 실습 코드로 Machine Learning Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Machine Learning Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Machine Learning Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“LIME: 국소 해석 가능한 모델 불문 설명” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Machine Learning Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Machine Learning Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- SHAP 값: 전역 및 국소 특성 중요도
- LIME: 국소 해석 가능한 모델 불문 설명
- 공정성 지표: 인구통계학적 동등성과 동등한 기회
- 편향 완화 전략: 전처리, 학습 중 처리, 후처리