100% found this document useful (5 votes)
21 views

Explainable AI Recipes: Implement Solutions to Model Explainability and Interpretability with Python 1st Edition Pradeepta Mishra 2024 scribd download

Explainable

Uploaded by

zgircumikeng
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (5 votes)
21 views

Explainable AI Recipes: Implement Solutions to Model Explainability and Interpretability with Python 1st Edition Pradeepta Mishra 2024 scribd download

Explainable

Uploaded by

zgircumikeng
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 66

Download Full Version ebookmass - Visit ebookmass.

com

Explainable AI Recipes: Implement Solutions to


Model Explainability and Interpretability with
Python 1st Edition Pradeepta Mishra

https://ebookmass.com/product/explainable-ai-recipes-
implement-solutions-to-model-explainability-and-
interpretability-with-python-1st-edition-pradeepta-mishra-2/

OR CLICK HERE

DOWLOAD NOW

Discover More Ebook - Explore Now at ebookmass.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Explainable AI Recipes: Implement Solutions to Model


Explainability and Interpretability with Python 1st
Edition Pradeepta Mishra
https://ebookmass.com/product/explainable-ai-recipes-implement-
solutions-to-model-explainability-and-interpretability-with-
python-1st-edition-pradeepta-mishra-2/
ebookmass.com

Productionizing AI: How to Deliver AI B2B Solutions with


Cloud and Python 1st Edition Barry Walsh

https://ebookmass.com/product/productionizing-ai-how-to-deliver-
ai-b2b-solutions-with-cloud-and-python-1st-edition-barry-walsh/

ebookmass.com

Introduction to Responsible AI: Implement Ethical AI Using


Python 1st Edition Manure

https://ebookmass.com/product/introduction-to-responsible-ai-
implement-ethical-ai-using-python-1st-edition-manure/

ebookmass.com

Developmental Psychology: The Growth of Mind and Behavior


(Ebook PDF)

https://ebookmass.com/product/developmental-psychology-the-growth-of-
mind-and-behavior-ebook-pdf/

ebookmass.com
The Palgrave Handbook of Malicious Use of AI and
Psychological Security Evgeny Pashentsev

https://ebookmass.com/product/the-palgrave-handbook-of-malicious-use-
of-ai-and-psychological-security-evgeny-pashentsev/

ebookmass.com

Handbook on Democracy and Security Nicholas A. Seltzer


(Editor)

https://ebookmass.com/product/handbook-on-democracy-and-security-
nicholas-a-seltzer-editor/

ebookmass.com

Spatiotemporal Random Fields, Second Edition: Theory and


Applications George Christakos

https://ebookmass.com/product/spatiotemporal-random-fields-second-
edition-theory-and-applications-george-christakos/

ebookmass.com

Never Been Kissed (Boy Meets Boy 1) Timothy Janovsky

https://ebookmass.com/product/never-been-kissed-boy-meets-
boy-1-timothy-janovsky/

ebookmass.com

The Code of Putinism Brian D. Taylor

https://ebookmass.com/product/the-code-of-putinism-brian-d-taylor/

ebookmass.com
Operations and Supply Chain Management: The Core 6th
Edition F. Robert Jacobs

https://ebookmass.com/product/operations-and-supply-chain-management-
the-core-6th-edition-f-robert-jacobs-2/

ebookmass.com
Pradeepta Mishra

Explainable AI Recipes
Implement Solutions to Model Explainability and
Interpretability with Python
Pradeepta Mishra
Bangalore, Karnataka, India

ISBN 978-1-4842-9028-6 e-ISBN 978-1-4842-9029-3


https://doi.org/10.1007/978-1-4842-9029-3

© Pradeepta Mishra 2023

Apress Standard

The use of general descriptive names, registered names, trademarks,


service marks, etc. in this publication does not imply, even in the
absence of a specific statement, that such names are exempt from the
relevant protective laws and regulations and therefore free for general
use.

The publisher, the authors, and the editors are safe to assume that the
advice and information in this book are believed to be true and accurate
at the date of publication. Neither the publisher nor the authors or the
editors give a warranty, expressed or implied, with respect to the
material contained herein or for any errors or omissions that may have
been made. The publisher remains neutral with regard to jurisdictional
claims in published maps and institutional affiliations.

This Apress imprint is published by the registered company APress


Media, LLC, part of Springer Nature.
The registered company address is: 1 New York Plaza, New York, NY
10004, U.S.A.
I dedicate this book to my late father; my mother; my lovely wife, Prajna;
and my daughters, Priyanshi (Aarya) and Adyanshi (Aadya). This work
would not have been possible without their inspiration, support, and
encouragement.
Introduction
Artificial intelligence plays a crucial role determining the decisions
businesses make. In these cases, when a machine makes a decision,
humans usually want to understand whether the decision is authentic
or whether it was generated in error. If business stakeholders are not
convinced by the decision, they will not trust the machine learning
system, and hence artificial intelligence adoption will gradually reduce
within that organization. To make the decision process more
transparent, developers must be able to document the explainability of
AI decisions or ML model decisions. This book provides a series of
solutions to problems that require explainability and interpretability.
Adopting an AI model and developing a responsible AI system requires
explainability as a component.
This book covers model interpretation for supervised learning
linear models, including important features for regression and
classification models, partial dependency analysis for regression and
classification models, and influential data point analysis for both
classification and regression models. Supervised learning models using
nonlinear models is explored using state-of-the-art frameworks such as
SHAP values/scores, including global explanation, and how to use LIME
for local interpretation. This book will also give you an understanding
of bagging, boosting-based ensemble models for supervised learning
such as regression and classification, as well as explainability for time-
series models using LIME and SHAP, natural language processing tasks
such as text classification, and sentiment analysis using ELI5, ALIBI.
The most complex models for classification and regression, such as
neural network models and deep learning models, are explained using
the CAPTUM framework, which shows feature attribution, neuron
attribution, and activation attribution.
This book attempts to make AI models explainable to help
developers increase the adoption of AI-based models within their
organizations and bring more transparency to decision-making. After
reading this book, you will be able to use Python libraries such as Alibi,
SHAP, LIME, Skater, ELI5, and CAPTUM. Explainable AI Recipes provides
a problem-solution approach to demonstrate each machine learning
model, and shows how to use Python’s XAI libraries to answer
questions of explainability and build trust with AI models and machine
learning models. All source code can be downloaded from
github.com/apress/explainable-ai-recipes.
Any source code or other supplementary material referenced by the
author in this book is available to readers on GitHub
(https://github.com/Apress). For more detailed information, please
visit www.apress.com/source-code.
Acknowledgments
I would like to thank my wife, Prajna, for her continuous inspiration
and support and for sacrificing her weekends to help me complete this
book; and my daughters, Aarya and Aadya, for being patient throughout
the writing process.
A big thank-you to Celestin Suresh John and Mark Powers for fast-
tracking the whole process and guiding me in the right direction.
I would like to thank the authors of the Appliances Energy
Prediction dataset (http://archive.ics.uci.edu/ml) for
making it available: D. Dua and C. Graff. I use this dataset in the book to
show how to develop a model and explain the predictions generated by
a regression model for the purpose of model explainability using
various explainable libraries.
Table of Contents
Chapter 1:​Introducing Explainability and Setting Up Your
Development Environment
Recipe 1-1.​SHAP Installation
Problem
Solution
How It Works
Recipe 1-2.​LIME Installation
Problem
Solution
How It Works
Recipe 1-3.​SHAPASH Installation
Problem
Solution
How It Works
Recipe 1-4.​ELI5 Installation
Problem
Solution
How It Works
Recipe 1-5.​Skater Installation
Problem
Solution
How It Works
Recipe 1-6.​Skope-rules Installation
Problem
Solution
How It Works
Recipe 1-7.​Methods of Model Explainability
Problem
Solution
How It Works
Conclusion
Chapter 2:​Explainability for Linear Supervised Models
Recipe 2-1.​SHAP Values for a Regression Model on All
Numerical Input Variables
Problem
Solution
How It Works
Recipe 2-2.​SHAP Partial Dependency Plot for a Regression
Model
Problem
Solution
How It Works
Recipe 2-3.​SHAP Feature Importance for Regression Model
with All Numerical Input Variables
Problem
Solution
How It Works
Recipe 2-4.​SHAP Values for a Regression Model on All Mixed
Input Variables
Problem
Solution
How It Works
Recipe 2-5.​SHAP Partial Dependency Plot for Regression
Model for Mixed Input
Problem
Solution
How It Works
Recipe 2-6.​SHAP Feature Importance for a Regression Model
with All Mixed Input Variables
Problem
Solution
How It Works
Recipe 2-7.​SHAP Strength for Mixed Features on the Predicted
Output for Regression Models
Problem
Solution
How It Works
Recipe 2-8.​SHAP Values for a Regression Model on Scaled Data
Problem
Solution
How It Works
Recipe 2-9.​LIME Explainer for Tabular Data
Problem
Solution
How It Works
Recipe 2-10.​ELI5 Explainer for Tabular Data
Problem
Solution
How It Works
Recipe 2-11.​How the Permutation Model in ELI5 Works
Problem
Solution
How It Works
Recipe 2-12.​Global Explanation for Logistic Regression Models
Problem
Solution
How It Works
Recipe 2-13.​Partial Dependency Plot for a Classifier
Problem
Solution
How It Works
Recipe 2-14.​Global Feature Importance from the Classifier
Problem
Solution
How It Works
Recipe 2-15.​Local Explanations Using LIME
Problem
Solution
How It Works
Recipe 2-16.​Model Explanations Using ELI5
Problem
Solution
How It Works
Conclusion
References
Chapter 3:​Explainability for Nonlinear Supervised Models
Recipe 3-1.​SHAP Values for Tree Models on All Numerical
Input Variables
Problem
Solution
How It Works
Recipe 3-2.​Partial Dependency Plot for Tree Regression Model
Problem
Solution
How It Works
Recipe 3-3.​SHAP Feature Importance for Regression Models
with All Numerical Input Variables
Problem
Solution
How It Works
Recipe 3-4.​SHAP Values for Tree Regression Models with All
Mixed Input Variables
Problem
Solution
How It Works
Recipe 3-5.​SHAP Partial Dependency Plot for Regression
Models with Mixed Input
Problem
Solution
How It Works
Recipe 3-6.​SHAP Feature Importance for Tree Regression
Models with All Mixed Input Variables
Problem
Solution
How It Works
Recipe 3-7.​LIME Explainer for Tabular Data
Problem
Solution
How It Works
Recipe 3-8.​ELI5 Explainer for Tabular Data
Problem
Solution
How It Works
Recipe 3-9.​How the Permutation Model in ELI5 Works
Problem
Solution
How It Works
Recipe 3-10.​Global Explanation for Decision Tree Models
Problem
Solution
How It Works
Recipe 3-11.​Partial Dependency Plot for a Nonlinear Classifier
Problem
Solution
How It Works
Recipe 3-12.​Global Feature Importance from the Nonlinear
Classifier
Problem
Solution
How It Works
Recipe 3-13.​Local Explanations Using LIME
Problem
Solution
How It Works
Recipe 3-14.​Model Explanations Using ELI5
Problem
Solution
How It Works
Conclusion
Chapter 4:​Explainability for Ensemble Supervised Models
Recipe 4-1.​Explainable Boosting Machine Interpretation
Problem
Solution
How It Works
Recipe 4-2.​Partial Dependency Plot for Tree Regression
Models
Problem
Solution
How It Works
Recipe 4-3.​Explain a Extreme Gradient Boosting Model with All
Numerical Input Variables
Problem
Solution
How It Works
Recipe 4-4.​Explain a Random Forest Regressor with Global and
Local Interpretations
Problem
Solution
How It Works
Recipe 4-5.​Explain the Catboost Regressor with Global and
Local Interpretations
Problem
Solution
How It Works
Recipe 4-6.​Explain the EBM Classifier with Global and Local
Interpretations
Problem
Solution
How It Works
Recipe 4-7.​SHAP Partial Dependency Plot for Regression
Models with Mixed Input
Problem
Solution
How It Works
Recipe 4-8.​SHAP Feature Importance for Tree Regression
Models with Mixed Input Variables
Problem
Solution
How It Works
Recipe 4-9.​Explaining the XGBoost Model
Problem
Solution
How It Works
Recipe 4-10.​Random Forest Regressor for Mixed Data Types
Problem
Solution
How It Works
Recipe 4-11.​Explaining the Catboost Model
Problem
Solution
How It Works
Recipe 4-12.​LIME Explainer for the Catboost Model and
Tabular Data
Problem
Solution
How It Works
Recipe 4-13.​ELI5 Explainer for Tabular Data
Problem
Solution
How It Works
Recipe 4-14.​How the Permutation Model in ELI5 Works
Problem
Solution
How It Works
Recipe 4-15.​Global Explanation for Ensemble Classification
Models
Problem
Solution
How It Works
Recipe 4-16.​Partial Dependency Plot for a Nonlinear Classifier
Problem
Solution
How It Works
Recipe 4-17.​Global Feature Importance from the Nonlinear
Classifier
Problem
Solution
How It Works
Recipe 4-18.​XGBoost Model Explanation
Problem
Solution
How It Works
Recipe 4-19.​Explain a Random Forest Classifier
Problem
Solution
How It Works
Recipe 4-20.​Catboost Model Interpretation for Classification
Scenario
Problem
Solution
How It Works
Recipe 4-21.​Local Explanations Using LIME
Problem
Solution
How It Works
Recipe 4-22.​Model Explanations Using ELI5
Problem
Solution
How It Works
Recipe 4-23.​Multiclass Classification Model Explanation
Problem
Solution
How It Works
Conclusion
Chapter 5:​Explainability for Natural Language Processing
Recipe 5-1.​Explain Sentiment Analysis Text Classification
Using SHAP
Problem
Solution
How It Works
Recipe 5-2.​Explain Sentiment Analysis Text Classification
Using ELI5
Problem
Solution
How It Works
Recipe 5-3.​Local Explanation Using ELI5
Problem
Solution
How It Works
Conclusion
Chapter 6:​Explainability for Time-Series Models
Recipe 6-1.​Explain Time-Series Models Using LIME
Problem
Solution
How It Works
Recipe 6-2.​Explain Time-Series Models Using SHAP
Problem
Solution
How It Works
Conclusion
Chapter 7:​Explainability for Deep Learning Models
Recipe 7-1.​Explain MNIST Images Using a Gradient Explainer
Based on Keras
Problem
Solution
How It Works
Recipe 7-2.​Use Kernel Explainer–Based SHAP Values from a
Keras Model
Problem
Solution
How It Works
Recipe 7-3.​Explain a PyTorch-Based Deep Learning Model
Problem
Solution
How It Works
Conclusion
Index
About the Author
Pradeepta Mishra
is an AI/ML leader, experienced data
scientist, and artificial intelligence
architect. He currently heads NLP, ML,
and AI initiatives for five products at
FOSFOR by LTI, a leading-edge innovator
in AI and machine learning based out of
Bangalore, India. He has expertise in
designing artificial intelligence systems
for performing tasks such as
understanding natural language and
making recommendations based on
natural language processing. He has filed
12 patents as an inventor and has
authored and coauthored five books,
including R Data Mining Blueprints (Packt Publishing, 2016), R: Mining
Spatial, Text, Web, and Social Media Data (Packt Publishing, 2017),
PyTorch Recipes (Apress, 2019), and Practical Explainable AI Using
Python (Apress, 2023). There are two courses available on Udemy
based on these books.
Pradeepta presented a keynote talk on the application of
bidirectional LSTM for time-series forecasting at the 2018 Global Data
Science Conference. He delivered the TEDx talk “Can Machines Think?”
on the power of artificial intelligence in transforming industries and job
roles across industries. He has also delivered more than 150 tech talks
on data science, machine learning, and artificial intelligence at various
meetups, technical institutions, universities, and community forums. He
is on LinkedIn (www.linkedin.com/in/pradeepta/) and Twitter
(@pradmishra1).
About the Technical Reviewer
Bharath Kumar Bolla
has more than ten years of experience
and is currently working as a senior data
science engineer consultant at Verizon,
Bengaluru. He has a PG diploma in data
science from Praxis Business School and
an MS in life sciences from Mississippi
State University. He previously worked
as a data scientist at the University of
Georgia, Emory University, and Eurofins
LLC & Happiest Minds. At Happiest
Minds, he worked on AI-based digital
marketing products and NLP-based
solutions in the education domain. Along
with his day-to-day responsibilities,
Bharath is a mentor and an active
researcher. To date, he has published ten articles in journals and peer-
reviewed conferences. He is particularly interested in unsupervised and
semisupervised learning and efficient deep learning architectures in
NLP and computer vision.
© The Author(s), under exclusive license to APress Media, LLC, part of Springer Nature 2023
P. Mishra, Explainable AI Recipes
https://doi.org/10.1007/978-1-4842-9029-3_1

1. Introducing Explainability and Setting Up Your


Development Environment
Pradeepta Mishra1
(1) Bangalore, Karnataka, India

Industries in which artificial intelligence has been applied include banking, financial services, insurance,
healthcare, manufacturing, retail, and pharmaceutical. There are regulatory requirements in some of these
industries where model explainability is required. Artificial intelligence involves classifying objects,
recognizing objects to detect fraud, and so forth. Every learning system requires three things: input data,
processing, and an output. If the performance of any learning system improves over time by learning from
new examples or data, it is called a machine learning system. When the number of features for a machine
learning task increases or the volume of data increases, it takes a lot of time to apply machine learning
techniques. That’s when deep learning techniques are used.
Figure 1-1 represents the relationships between artificial intelligence, machine learning, and deep
learning.

Figure 1-1 Relationships among ML, DL, and AI

After preprocessing and feature creation, you can observe hundreds of thousands of features that need
to be computed to produce output. If we train a machine learning supervised model, it will take significant
time to produce the model object. To achieve scalability in this task, we need deep learning algorithms, such
as a recurrent neural network. This is how artificial intelligence is connected to deep learning and machine
learning.
In the classical predictive modeling scenario, a function is identified, and the input data is usually fit to
the function to produce the output, where the function is usually predetermined. In a modern predictive
modeling scenario, the input data and output are both shown to a group of functions, and the machine
identifies the best function that approximates well to the output given a particular set of input. There is a
need to explain the output of a machine learning and deep learning model in performing regression- and
classification-related tasks. These are the reasons why explainability is required:
Trust: To gain users’ trust on the predicted output
Reliability: To make the user rely on the predicted output
Regulatory: To meet regulatory and compliance requirements
Adoption: To increase AI adoption among the users
Fairness: To remove any kind of discrimination in prediction
Accountability: To establish ownership of the predictions
There are various ways that explainability can be achieved using statistical properties, probabilistic
properties and associations, and causality among the features. Broadly, the explanations of the models can
be classified into two categories, global explanations and local explanations. The objective of local
explanation is to understand the inference generated for one sample at a time by comparing the nearest
possible data point; global explanation provides an idea about the overall model behavior.
The goal of this chapter is to introduce how to install various explainability libraries and interpret the
results generated by those explainability libraries.

Recipe 1-1. SHAP Installation


Problem
You want to install the SHAP (shapely additive explanations) library.

Solution
The solution to this problem is to use the simple pip or conda option.

How It Works
Let’s take a look at the following script examples. The SHAP Python library is based on a game theoretic
approach that attempts to explain local and as well as global explanations.

pip install shap

or

conda install -c conda-forge shap

Looking in indexes: https://pypi.org/simple, https://us-


python.pkg.dev/colab-wheels/public/simple/
Collecting shap
Downloading shap-0.41.0-cp37-cp37m-
manylinux_2_12_x86_64.manylinux2010_x86_64.whl (569 kB)
|████████████████████████████████| 569 kB 8.0 MB/s
Requirement already satisfied: tqdm>4.25.0 in /usr/local/lib/python3.7/dist-
packages (from shap) (4.64.1)
Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-
packages (from shap) (1.3.5)
Collecting slicer==0.0.7
Downloading slicer-0.0.7-py3-none-any.whl (14 kB)
Requirement already satisfied: cloudpickle in /usr/local/lib/python3.7/dist-
packages (from shap) (1.5.0)
Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-
packages (from shap) (1.7.3)
Requirement already satisfied: scikit-learn in
/usr/local/lib/python3.7/dist-packages (from shap) (1.0.2)
Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-
packages (from shap) (1.21.6)
Requirement already satisfied: numba in /usr/local/lib/python3.7/dist-
packages (from shap) (0.56.2)
Requirement already satisfied: packaging>20.9 in
/usr/local/lib/python3.7/dist-packages (from shap) (21.3)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in
/usr/local/lib/python3.7/dist-packages (from packaging>20.9->shap) (3.0.9)
Requirement already satisfied: llvmlite<0.40,>=0.39.0dev0 in
/usr/local/lib/python3.7/dist-packages (from numba->shap) (0.39.1)
Requirement already satisfied: setuptools<60 in
/usr/local/lib/python3.7/dist-packages (from numba->shap) (57.4.0)
Requirement already satisfied: importlib-metadata in
/usr/local/lib/python3.7/dist-packages (from numba->shap) (4.12.0)
Requirement already satisfied: typing-extensions>=3.6.4 in
/usr/local/lib/python3.7/dist-packages (from importlib-metadata->numba-
>shap) (4.1.1)
Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-
packages (from importlib-metadata->numba->shap) (3.8.1)
Requirement already satisfied: python-dateutil>=2.7.3 in
/usr/local/lib/python3.7/dist-packages (from pandas->shap) (2.8.2)
Requirement already satisfied: pytz>=2017.3 in
/usr/local/lib/python3.7/dist-packages (from pandas->shap) (2022.2.1)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-
packages (from python-dateutil>=2.7.3->pandas->shap) (1.15.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in
/usr/local/lib/python3.7/dist-packages (from scikit-learn->shap) (3.1.0)
Requirement already satisfied: joblib>=0.11 in
/usr/local/lib/python3.7/dist-packages (from scikit-learn->shap) (1.1.0)
Installing collected packages: slicer, shap
Successfully installed shap-0.41.0 slicer-0.0.7

Recipe 1-2. LIME Installation


Problem
You want to install the LIME Python library.

Solution
You can install the LIME library using pip or conda.

How It Works
Let’s take a look at the following example script:

pip install lime

or

conda install -c conda-forge lime

Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-


wheels/public/simple/
Collecting lime
Downloading lime-0.2.0.1.tar.gz (275 kB)
|████████████████████████████████| 275 kB 7.5 MB/s
Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-pac
(from lime) (3.2.2)
Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages
(from lime) (1.21.6)
Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages
(from lime) (1.7.3)
Requirement already satisfied: tqdm in /usr/local/lib/python3.7/dist-packages
lime) (4.64.1)
Requirement already satisfied: scikit-learn>=0.18 in /usr/local/lib/python3.7/
packages (from lime) (1.0.2)
Requirement already satisfied: scikit-image>=0.12 in /usr/local/lib/python3.7/
packages (from lime) (0.18.3)
Requirement already satisfied: networkx>=2.0 in /usr/local/lib/python3.7/dist-
packages (from scikit-image>=0.12->lime) (2.6.3)
Requirement already satisfied: PyWavelets>=1.1.1 in /usr/local/lib/python3.7/d
packages (from scikit-image>=0.12->lime) (1.3.0)
Requirement already satisfied: pillow!=7.1.0,!=7.1.1,>=4.3.0 in
/usr/local/lib/python3.7/dist-packages (from scikit-image>=0.12->lime) (7.1.2)
Requirement already satisfied: imageio>=2.3.0 in /usr/local/lib/python3.7/dist
packages (from scikit-image>=0.12->lime) (2.9.0)
Requirement already satisfied: tifffile>=2019.7.26 in
/usr/local/lib/python3.7/dist-packages (from scikit-image>=0.12->lime) (2021.1
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/d
packages (from matplotlib->lime) (1.4.4)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-
packages (from matplotlib->lime) (0.11.0)
Requirement already satisfied: python-dateutil>=2.1 in
/usr/local/lib/python3.7/dist-packages (from matplotlib->lime) (2.8.2)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in
/usr/local/lib/python3.7/dist-packages (from matplotlib->lime) (3.0.9)
Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/d
packages (from kiwisolver>=1.0.1->matplotlib->lime) (4.1.1)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packa
(from python-dateutil>=2.1->matplotlib->lime) (1.15.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in
/usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.18->lime) (3.1.0)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-
packages (from scikit-learn>=0.18->lime) (1.1.0)
Building wheels for collected packages: lime
Building wheel for lime (setup.py) ... done
Created wheel for lime: filename=lime-0.2.0.1-py3-none-any.whl size=283857
sha256=674ceb94cdcb54588f66c5d5bef5f6ae0326c76e645c40190408791cbe4311d5
Stored in directory:
/root/.cache/pip/wheels/ca/cb/e5/ac701e12d365a08917bf4c6171c0961bc880a8181359c
Successfully built lime
Installing collected packages: lime
Successfully installed lime-0.2.0.1

Recipe 1-3. SHAPASH Installation


Problem
You want to install SHAPASH.

Solution
If you want to use a combination of functions from both the LIME library and the SHAP library, then you can
use the SHAPASH library. You just have to install it, which is simple.

How It Works
Let’s take a look at the following code to install SHAPASH. This is not available on the Anaconda distribution;
the only way to install it is by using pip.

pip install shapash

Recipe 1-4. ELI5 Installation


Problem
You want to install ELI5.

Solution
Since this is a Python library, you can use pip.

How It Works
Let’s take a look at the following script:

pip install eli5


Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-
wheels/public/simple/
Collecting eli5
Downloading eli5-0.13.0.tar.gz (216 kB)
|████████████████████████████████| 216 kB 6.9 MB/s
Requirement already satisfied: attrs>17.1.0 in /usr/local/lib/python3.7/dist-
packages (from eli5) (22.1.0)
Collecting jinja2>=3.0.0
Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
|████████████████████████████████| 133 kB 42.7 MB/s
Requirement already satisfied: numpy>=1.9.0 in /usr/local/lib/python3.7/dist-
packages (from eli5) (1.21.6)
Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages
(from eli5) (1.7.3)
Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages
eli5) (1.15.0)
Requirement already satisfied: scikit-learn>=0.20 in /usr/local/lib/python3.7/
packages (from eli5) (1.0.2)
Requirement already satisfied: graphviz in /usr/local/lib/python3.7/dist-packa
(from eli5) (0.10.1)
Requirement already satisfied: tabulate>=0.7.7 in /usr/local/lib/python3.7/dis
packages (from eli5) (0.8.10)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.7/dis
packages (from jinja2>=3.0.0->eli5) (2.0.1)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.7/dist-
packages (from scikit-learn>=0.20->eli5) (1.1.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in
/usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.20->eli5) (3.1.0)
Building wheels for collected packages: eli5
Building wheel for eli5 (setup.py) ... done
Created wheel for eli5: filename=eli5-0.13.0-py2.py3-none-any.whl size=10774
sha256=3e02d416bd1cc21aebce604207129919a096a92128d7d27c50be1f3a97d3b1de
Stored in directory:
/root/.cache/pip/wheels/cc/3c/96/3ead31a8e6c20fc0f1a707fde2e05d49a80b1b4b30096
Successfully built eli5
Installing collected packages: jinja2, eli5
Attempting uninstall: jinja2
Found existing installation: Jinja2 2.11.3
Uninstalling Jinja2-2.11.3:
Successfully uninstalled Jinja2-2.11.3
ERROR: pip's dependency resolver does not currently take into account all the
packages that are installed. This behavior is the source of the following
dependency conflicts.
flask 1.1.4 requires Jinja2<3.0,>=2.10.1, but you have jinja2 3.1.2 which is
incompatible.
Successfully installed eli5-0.13.0 jinja2-3.1.2

Recipe 1-5. Skater Installation


Problem
You want to install Skater.

Solution
Skater is an open-source framework to enable model interpretation for various kinds of machine learning
models. The Python-based Skater library provides both global and local interpretations and can be installed
using pip.

How It Works
Let’s take a look at the following script:

pip install skater

Recipe 1-6. Skope-rules Installation


Problem
You want to install Skopes-rule.

Solution
Skope-rules offers a trade-off between the interpretability of a decision tree and the modeling power of a
random forest model. The solution is simple; you use the pip command.

How It Works
Let’s take a look at the following code:

pip install skope-rules


Looking in indexes: https://pypi.org/simple, https://us-
python.pkg.dev/colab-wheels/public/simple/
Collecting skope-rules
Downloading skope_rules-1.0.1-py3-none-any.whl (14 kB)
Requirement already satisfied: numpy>=1.10.4 in
/usr/local/lib/python3.7/dist-packages (from skope-rules) (1.21.6)
Requirement already satisfied: scikit-learn>=0.17.1 in
/usr/local/lib/python3.7/dist-packages (from skope-rules) (1.0.2)
Requirement already satisfied: pandas>=0.18.1 in
/usr/local/lib/python3.7/dist-packages (from skope-rules) (1.3.5)
Requirement already satisfied: scipy>=0.17.0 in
/usr/local/lib/python3.7/dist-packages (from skope-rules) (1.7.3)
Requirement already satisfied: pytz>=2017.3 in
/usr/local/lib/python3.7/dist-packages (from pandas>=0.18.1->skope-rules)
(2022.2.1)
Requirement already satisfied: python-dateutil>=2.7.3 in
/usr/local/lib/python3.7/dist-packages (from pandas>=0.18.1->skope-rules)
(2.8.2)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-
packages (from python-dateutil>=2.7.3->pandas>=0.18.1->skope-rules) (1.15.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in
/usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.17.1->skope-
rules) (3.1.0)
Requirement already satisfied: joblib>=0.11 in
/usr/local/lib/python3.7/dist-packages (from scikit-learn>=0.17.1->skope-
rules) (0.11)
Installing collected packages: skope-rules
Successfully installed skope-rules-1.0.1

Recipe 1-7. Methods of Model Explainability


Problem
There are various libraries and many explanations for how to identify the right method for model
explainability.

Solution
The explainability method depends on who is the consumer of the model output, if it is the business or
senior management then the explainability should be very simple and plain English without any
mathematical formula and if the consumer of explainability is data scientists and machine learning
engineers then the explanations may include the mathematical formulas.

How It Works
The levels of transparency of the machine learning models can be categorized into three buckets, as shown
in Figure 1-2.

Figure 1-2 Methods of model explainability

Textual explanations require explaining the mathematical formula in plain English, which can help
business users or senior management. The interpretations can be designed based on model type and model
variant and can draw inferences from the model outcome. A template to draw inferences can be designed
and mapped to the model types, and then the templates can be filled in using some natural language
processing methods.
A visual explainability method can be used to generate charts, graphs such as dendrograms, or any other
types of graphs that best explain the relationships. The tree-based methods use if-else conditions on the
back end; hence, it is simple to show the causality and the relationship.
Using common examples and business scenarios from day-to-day operations and drawing parallels
between them can also be useful.
Which method you should choose depends on the problem that needs to be solved and the consumer of
the solution where the machine learning model is being used.

Conclusion
In various AI projects and initiatives, the machine learning models generate predictions. Usually, to trust the
outcomes of a model, a detailed explanation is required. Since many people are not comfortable explaining
the machine learning model outcomes, they cannot reason out the decisions of a model, and thereby AI
adoption is restricted. Explainability is required from regulatory stand point as well as auditing and
compliance point of view. In high-risk use cases such as medical imaging and object detection or pattern
recognition, financial prediction and fraud detection, etc., explainability is required to explain the decisions
of the machine learning model.
In this chapter, we set up the environment by installing various explainable AI libraries. Machine
learning model interpretability and explainability are the key focuses of this book. We are going to use
Python-based libraries, frameworks, methods, classes, and functions to explain the models.
In the next chapter, we are going to look at the linear models.
© The Author(s), under exclusive license to APress Media, LLC, part of Springer Nature 2023
P. Mishra, Explainable AI Recipes
https://doi.org/10.1007/978-1-4842-9029-3_2

2. Explainability for Linear Supervised Models


Pradeepta Mishra1
(1) Bangalore, Karnataka, India

A supervised learning model is a model that is used to train an algorithm to map input data to output data. A
supervised learning model can be of two types: regression or classification. In a regression scenario, the
output variable is numerical, whereas with classification, the output variable is binary or multinomial. A
binary output variable has two outcomes, such as true and false, accept and reject, yes and no, etc. In the
case of multinomial output variables, the outcome can be more than two, such as high, medium, and low. In
this chapter, we are going to use explainable libraries to explain a regression model and a classification
model, while training a linear model.
In the classical predictive modeling scenario, a function has been identified, and the input data is usually
fit to the function to produce the output, where the function is usually predetermined. In a modern
predictive modeling scenario, the input data and output are both shown to a group of functions, and the
machine identifies the best function that approximates well to the output given a particular set of input.
There is a need to explain the output of machine learning and deep learning models when performing
regression and classification tasks. Linear regression and linear classification models are simpler to explain.
The goal of this chapter is to introduce various explainability libraries for linear models such as feature
importance, partial dependency plot, and local interpretation.

Recipe 2-1. SHAP Values for a Regression Model on All Numerical Input
Variables
Problem
You want to explain a regression model built on all the numeric features of a dataset.

Solution
A regression model on all the numeric features is trained, and then the trained model will be passed through
SHAP to generate global explanations and local explanations.

How It Works
Let’s take a look at the following script. The Shapely value can be called the SHAP value. It is used to explain
the model. It uses the impartial distribution of predictions from a cooperative game theory to attribute a
feature to the model’s predictions. Input features from the dataset are considered as players in the game.
The models function is considered the rules of the game. The Shapely value of a feature is computed based
on the following steps:
1. SHAP requires model retraining on all feature subsets; hence, usually it takes time if the explanation has
to be generated for larger datasets.

2. Identify a feature set from a list of features (let’s say there are 15 features, and we can select a subset
with 5 features).

3. For any particular feature, two models using the subset of features will be created, one with the feature
and another without the feature.
4. Then the prediction differences will be computed.

5. The differences in prediction are computed for all possible subsets of features.

6. The weighted average value of all possible differences is used to populate the feature importance.

If the weight of the feature is 0.000, then we can conclude that the feature is not important and has not
joined the model. If it is not equal to 0.000, then we can conclude that the feature has a role to play in the
prediction process.
We are going to use a dataset from the UCI machine learning repository. The URL to access the dataset is
as follows:
https://archive.ics.uci.edu/ml/datasets/Appliances+energy+prediction
The objective is to predict the appliances’ energy use in Wh, using the features from sensors. There are
27 features in the dataset, and here we are trying to understand what features are important in predicting
the energy usage. See Table 2-1.

Table 2-1 Feature Description from the Energy Prediction Dataset

Feature Name Description Unit


Appliances Energy use In Wh
Lights Energy use of light fixtures in the house In Wh
T1 Temperature in kitchen area In Celsius
RH_1 Humidity in kitchen area In %
T2 Temperature in living room area In Celsius
RH_2 Humidity in living room area In %
T3 Temperature in laundry room area
RH_3 Humidity in laundry room area In %
T4 Temperature in office room In Celsius
RH_4 Humidity in office room In %
T5 Temperature in bathroom In Celsius
RH_5 Humidity in bathroom In %
T6 Temperature outside the building (north side) In Celsius
RH_6 Humidity outside the building (north side) In %
T7 Temperature in ironing room In Celsius
RH_7 Humidity in ironing room In %
T8 Temperature in teenager room 2 In Celsius
RH_8 Humidity in teenager room 2 In %
T9 Temperature in parents room In Celsius
RH_9 Humidity in parents room In %
To Temperature outside (from the Chievres weather station) In Celsius
Pressure (from Chievres weather station) In mm Hg
aRH_out Humidity outside (from the Chievres weather station) In %
Wind speed (from Chievres weather station) In m/s
Visibility (from Chievres weather station) In km
Tdewpoint (from Chievres weather station) Â °C
rv1 Random variable 1 Nondimensional
rv2 Random variable 2 Nondimensional
import pandas as pd
df_lin_reg = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-
databases/00374/energydata_complete.csv')
del df_lin_reg['date']
df_lin_reg.info()
df_lin_reg.columns
Index(['Appliances', 'lights', 'T1', 'RH_1', 'T2', 'RH_2', 'T3', 'RH_3',
'T4', 'RH_4', 'T5', 'RH_5', 'T6', 'RH_6', 'T7', 'RH_7', 'T8', 'RH_8', 'T9',
'RH_9', 'T_out', 'Press_mm_hg', 'RH_out', 'Windspeed', 'Visibility',
'Tdewpoint', 'rv1', 'rv2'], dtype='object')

#y is the dependent variable, that we need to predict


y = df_lin_reg.pop('Appliances')
# X is the set of input features
X = df_lin_reg

import pandas as pd
import shap
import sklearn

# a simple linear model initialized


model = sklearn.linear_model.LinearRegression()

# linear regression model trained


model.fit(X, y)

print("Model coefficients:\n")
for i in range(X.shape[1]):
print(X.columns[i], "=", model.coef_[i].round(5))

Model coefficients:

lights = 1.98971
T1 = -0.60374
RH_1 = 15.15362
T2 = -17.70602
RH_2 = -13.48062
T3 = 25.4064
RH_3 = 4.92457
T4 = -3.46525
RH_4 = -0.17891
T5 = -0.02784
RH_5 = 0.14096
T6 = 7.12616
RH_6 = 0.28795
T7 = 1.79463
RH_7 = -1.54968
T8 = 8.14656
RH_8 = -4.66968
T9 = -15.87243
RH_9 = -0.90102
T_out = -10.22819
Press_mm_hg = 0.13986
RH_out = -1.06375
Windspeed = 1.70364
Visibility = 0.15368
Tdewpoint = 5.0488
rv1 = -0.02078
rv2 = -0.02078

# compute the SHAP values for the linear model


explainer = shap.Explainer(model.predict, X)

# SHAP value calculation


shap_values = explainer(X)
Permutation explainer: 19736it [16:15, 20.08it/s]
This part of the script takes time as it is a computationally intensive process. The explainer function
calculates permutations, which means taking a feature set and generating the prediction difference. This
difference is the presence of one feature and the absence of the same feature. For faster calculation, we can
reduce the sample size to a smaller set, let’s say 1,000 or 2,000. In the previous script, we are using the
entire population of 19,735 records to calculate the SHAP values. This part of the script can be improved by
applying Python multiprocessing, which is beyond the scope of this chapter.
The SHAP value for a specific feature 𝑖 is just the difference between the expected model output and the
partial dependence plot at the feature’s value 𝑥𝑖. One of the fundamental properties of Shapley values is that
they always sum up to the difference between the game outcome when all players are present and the game
outcome when no players are present. For machine learning models, this means that SHAP values of all the
input features will always sum up to the difference between the baseline (expected) model output and the
current model output for the prediction being explained.
SHAP values have three objects: (a) the SHAP value for each feature, (b) the base value, and (c) the
original training data. As there are 27 features, we can expect 27 shap values.

pd.DataFrame(np.round(shap_values.values,3)).head(3)

# average prediction value is called as the base value


pd.DataFrame(np.round(shap_values.base_values,3)).head(3)

pd.DataFrame(np.round(shap_values.data,3)).head(3)

Recipe 2-2. SHAP Partial Dependency Plot for a Regression Model


Problem
You want to get a partial dependency plot from SHAP.

Solution
The solution to this problem is to use the partial dependency method (partial_dependence_plot)
from the model.

How It Works
Let’s take a look at the following example. There are two ways to get the partial dependency plot, one with a
particular data point superimposed and the other without any reference to the data point. See Figure 2-1.

# make a standard partial dependence plot for lights on predicted output for
row number 20 from the training dataset.
sample_ind = 20
shap.partial_dependence_plot(
"lights", model.predict, X, model_expected_value=True,
feature_expected_value=True, ice=False,
shap_values=shap_values[sample_ind:sample_ind+1,:]
)

Figure 2-1 Correlation between feature light and predicted output of the model

The partial dependency plot is a way to explain the individual predictions and generate local
interpretations for the sample selected from the dataset; in this case, the sample 20th record is selected from
the training dataset. Figure 2-1 shows the partial dependency superimposed with the 20th record in red.

shap.partial_dependence_plot(
"lights", model.predict, X, ice=False,
model_expected_value=True, feature_expected_value=True
)
Figure 2-2 Partial dependency plot between lights and predicted outcome from the model

# the waterfall_plot shows how we get from shap_values.base_values to


model.predict(X)[sample_ind]
shap.plots.waterfall(shap_values[sample_ind], max_display=14)

Figure 2-3 Local interpretation for record number 20

The local interpretation for record number 20 from the training dataset is displayed in Figure 2-3. The
predicted output for the 20th record is 140 Wh. The most influential feature impacting the 20th record is
RH_1, which is the humidity in the kitchen area in percentage, and RH_2, which is the humidity in the living
room area. On the bottom of Figure 2-3, there are 14 features that are not very important for the 20th
record’s predicted value.
X[20:21]
model.predict(X[20:21])
array([140.26911466])

Recipe 2-3. SHAP Feature Importance for Regression Model with All
Numerical Input Variables
Problem
You want to calculate the feature importance using the SHAP values.

Solution
The solution to this problem is to use SHAP absolute values from the model.

How It Works
Let’s take a look at the following example. SHAP values can be used to show the global importance of
features. Importance features means features that have a larger importance in predicting the output.

#computing shap importance values for the linear model


import numpy as np
feature_names = shap_values.feature_names
shap_df = pd.DataFrame(shap_values.values, columns=feature_names)
vals = np.abs(shap_df.values).mean(0)
shap_importance = pd.DataFrame(list(zip(feature_names, vals)), columns=
['col_name', 'feature_importance_vals'])
shap_importance.sort_values(by=['feature_importance_vals'], ascending=False,
inplace=True)

print(shap_importance)
col_name feature_importance_vals
2 RH_1 49.530061
19 T_out 43.828847
4 RH_2 42.911069
5 T3 41.671587
11 T6 34.653893
3 T2 31.097282
17 T9 26.607721
16 RH_8 19.920029
24 Tdewpoint 17.443688
21 RH_out 13.044643
6 RH_3 13.042064
15 T8 12.803450
0 lights 11.907603
12 RH_6 7.806188
14 RH_7 6.578015
7 T4 5.866801
22 Windspeed 3.361895
13 T7 3.182072
18 RH_9 3.041144
23 Visibility 1.385616
10 RH_5 0.855398
20 Press_mm_hg 0.823456
1 T1 0.765753
8 RH_4 0.642723
25 rv1 0.260885
26 rv2 0.260885
9 T5 0.041905
All the feature importance values are not scaled; hence, sum of values from all features will not be
totaling 100.
The beeswarm chart in Figure 2-4 shows the impact of SHAP values on model output. The blue dot
shows a low feature value, and a red dot shows a high feature value. Each dot indicates one data point from
the dataset. The beeswarm plot shows the distribution of feature values against the SHAP values.

shap.plots.beeswarm(shap_values)

Figure 2-4 Impact on model output

Recipe 2-4. SHAP Values for a Regression Model on All Mixed Input Variables
Problem
How do you estimate SHAP values when you introduce the categorical variables along with the numerical
variables, which is a mixed set of input features.

Solution
The solution is that the mixed input variables that have numeric features as well as categorical or binary
features can be modeled together. As the number of features increases, the time to compute all the
permutations will also increase.

How It Works
We are going to use an automobile public dataset with some modifications. The objective is to predict the
price of a vehicle given the features such as make, location, age, etc. It is a regression problem that we are
going to solve using a mix of numeric and categorical features.

df =
pd.read_csv('https://raw.githubusercontent.com/pradmishra1/PublicDatasets/main
df.head(3)
df.columns
Index(['Price', 'Make', 'Location', 'Age', 'Odometer', 'FuelType', 'Transmissi
'Mileage', 'EngineCC', 'PowerBhp'], dtype='object')

We cannot use string-based features or categorical features in the model directly as matrix multiplication
is not possible on string features; hence, the string-based features need to be transformed into dummy
variables or binary features with 0 and 1 flags. The transformation step is skipped here because many data
scientists already know how to do this data transformation. We are importing another transformed dataset
directly.

df_t =
pd.read_csv('https://raw.githubusercontent.com/pradmishra1/PublicDatasets/main
del df_t['Unnamed: 0']
df_t.head(3)
df_t.columns
Index(['Price', 'Age', 'Odometer', 'mileage', 'engineCC', 'powerBhp', 'Locatio
'Location_Chennai', 'Location_Coimbatore', 'Location_Delhi', 'Location_Hyderab
'Location_Kochi', 'Location_Kolkata', 'Location_Mumbai', 'Location_Pune', 'Fue
'FuelType_Electric', 'FuelType_LPG', 'FuelType_Petrol', 'Transmission_Manual',
Above', 'OwnerType_Second', 'OwnerType_Third'], dtype='object')

#y is the dependent variable, that we need to predict


y = df_t.pop('Price')
# X is the set of input features
X = df_t

import pandas as pd
import shap
import sklearn

# a simple linear model initialized


model = sklearn.linear_model.LinearRegression()

# linear regression model trained


model.fit(X, y)

print("Model coefficients:\n")
for i in range(X.shape[1]):
print(X.columns[i], "=", model.coef_[i].round(5))
Model coefficients:

Age = -0.92281
Odometer = 0.0
mileage = -0.07923
engineCC = -4e-05
powerBhp = 0.1356
Location_Bangalore = 2.00658
Location_Chennai = 0.94944
Location_Coimbatore = 2.23592
Location_Delhi = -0.29837
Location_Hyderabad = 1.8771
Location_Jaipur = 0.8738
Location_Kochi = 0.03311
Location_Kolkata = -0.86024
Location_Mumbai = -0.81593
Location_Pune = 0.33843
FuelType_Diesel = -1.2545
FuelType_Electric = 7.03139
FuelType_LPG = 0.79077
FuelType_Petrol = -2.8691
Transmission_Manual = -2.92415
OwnerType_Fourth +ACY- Above = 1.7104
OwnerType_Second = -0.55923
OwnerType_Third = 0.76687
To compute the SHAP values, we can use the explainer function with the training dataset X and model
predict function. The SHAP value calculation happens using a permutation approach; it took 5 minutes.

# compute the SHAP values for the linear model


explainer = shap.Explainer(model.predict, X)

# SHAP value calculation


shap_values = explainer(X)
Permutation explainer: 6020it [05:14, 18.59it/s]

import numpy as np
pd.DataFrame(np.round(shap_values.values,3)).head(3)

# average prediction value is called as the base value


pd.DataFrame(np.round(shap_values.base_values,3)).head(3)

0
0 11.933
1 11.933
2 11.933

pd.DataFrame(np.round(shap_values.data,3)).head(3)

Recipe 2-5. SHAP Partial Dependency Plot for Regression Model for Mixed
Input
Problem
You want to plot the partial dependency plot and interpret the graph for numeric and categorical dummy
variables.

Solution
The partial dependency plot shows the correlation between the feature and the predicted output of the
target variables. There are two ways we can showcase the results, one with a feature and expected value of
the prediction function and the other with superimposing a data point on the partial dependency plot.

How It Works
Let’s take a look at the following example (see Figure 2-5):

shap.partial_dependence_plot(
"powerBhp", model.predict, X, ice=False,
model_expected_value=True, feature_expected_value=True
)
Random documents with unrelated
content Scribd suggests to you:
oli mennyt naimisiin oman renkinsä kanssa. Välillä nauroi hän
käheästi. — Erkki kuunteli vain puolella korvalla, mutta hän kuuli
kuitenkin. Ja jälleen tunsi hän mielensä painostuvan, turhaksi kaiken
työnsä ja taistelonsa.

Siinä se oli, se suuri, se väkevä, se harmaa, jota hän oli ikänsä


päältään torjunut, jonka peitseen hän oli punaisimman sydänverensä
vuodattanut ja jonka hän jo oli luullut kauas karkoittaneensa. Se istui
nyt tuossa hänen ääressään, irvisti häntä vastaan oman äidin
ikenistä, levitti kolkot siipensä hänen ylleen ja tahtoi estää hänet
hengittämästä. Eikö hän itsekin kuulunut tähän maaperään, eivätkö
hänenkin syvimmät juurensa olleet täällä? Turhaa oli enää
pyrkiäkään täältä pois, tuhannet säikeet kiinnittivät häntä tänne,
veren ja vanhojen muistojen kahleet, kovat kuin rauta. Ei, ei koskaan
onnistuisi hänen niitä enää rikkoa! Eikö ollutkin parasta panna
silmänsä kiini ja vaipua, vajota maan matalan poveen, kotoisen
maailman tasalle? Mikä oli hän, että hän päänsä pystympänä pitäisi
ja heimoansa halveksuisi, — säälisi kaikessa tapauksessa?

— Jumalan kiitos! Summa oli täysi. Hän oli jo laskiessaan


peljännyt sitäkin, vaikka hän kyllä ennenkin oli laskenut rahat. Olisi
sittenkin voinut puuttua jotakin, olisi jälleen alkanut sama juoksu ja
rehkiminen. Ei puuttunut mitään. Nyt ei muuta kuin setelit kiireesti
kirjekuoreen ja sitten postiin. Postimies voisi kaupungissa vaihtaa ne
suuremmiksi rahoiksi.

Samassa tuli Anni käskemään häntä keittiöön. Siellä oli joku, joka
etsi Erkkiä. Erkki jätti setelitukun pöydän nurkalle ja meni. — Se oli
kutsu kirkonkylän kauppiaan luo yksinkertaisille illallisille.

Erkki palasi takaisin ja huomasi heti, että rahat pöydällä eivät


olleet samassa järjestyksessä, mihin hän ne oli jättänyt. Hän laski ne
uudelleen. Aivan oikein, kaksi punalaitaa oli kadonnut. Oliko tuuli ne
vienyt? Tuuli kaksois-ikkunain läpi! Kissa? Heillä ei ollut kissaa.
Huoneessa ei ollut käynyt kukaan. Siis ei niitä ollut voinut ottaa
kukaan muu kuin äiti.

Hän katsahti äidin vuoteelle päin. Äiti oli nukkuvinaan. Vaikka hän
oli viipynyt poissa tuskin viittä minuuttia, oli äiti muka ehtinyt sillä
aikaa vaipua syvään uneen. Hän makasi kasvot seinään päin ja
kuorsasi kovasti.

Erkki tunsi tuskan hien kohoavan otsalleen. Oliko äiti todellakin


ottanut rahat? Hän katsoi pöydälle, katsoi pöydän alle, tutki
lompakkonsa ja luki jälleen rahat. Koi ei niitä ollut voinut syödä, ei
ruoste raiskata. Siis oli äiti ottanut ne.

— Äiti!

Äiti ei liikahtanutkaan.

— Äiti!

Ei vastausta.

— Äiti! Äiti! Otitko jotakin tuosta pöydältä?

Erkki meni hädissään hakemaan Annia. Hän oli niin kiihoittunut,


että koko hänen ruumiinsa vapisi.

— Tiedätkö? Äiti on varastanut minulta?

— Oletko varma siitä?

— Olen. Minä jätin rahat pöydälle ja nyt ei niitä enää ole siinä.
Anni pyyhki kätensä ja tuli päättäväisenä Erkin perästä kamariin.
Hän astui kursailematta äidin vuoteen luo ja pudisti häntä hartioista.

— Täti! Oletko sinä ottanut Erkin rahat? Anna ne heti paikalla


hänelle!

Äiti kuorsasi yhä edelleen.

— Sitten otan minä ne sinulta väkisin.

— Älä, älä!

Erkki riensi häntä estämään. Kohtaus alkoi käydä hänestä jo liian


inhoittavaksi. Mutta Anni oli jo ehtinyt vetää äidin käden peiton alta.
Siinä olivat rutistuneet setelit.

Erkki rukoili:

— Äiti! Anna ne minulle hyvällä! Tiedäthän, että tarvitsen ne


välttämättömästi.

Äiti ei vieläkään sanonut mitään. Hänen silmänsä olivat kiini ja


hänen huulensa lujasti yhteen puristetut.

Anni sanoi:

— Hän ei anna niitä. Pidä hänen toista kättään, että hän ei pääse
repimään niitä! Minä otan ne häneltä.

Silloin vasta heräsi äiti. Hän itki ja rukoili, pyysi ja vaikeroi. Erkillä
oli niin paljon rahoja, hänellä ei mitään, Erkki oli niin paljon nauttinut
maailmasta, hän ei ollenkaan. Hän oli Erkin edestä raatanut ja
taistellut, antanut viimeisen penninsäkin Erkin koulunkäyntiin; nyt ei
Erkki tahtonut antaa hänelle edes osaa paljostaan. Kohta hän
kuolisi, ei Erkillä enää hänestä kauan vaivaa olisi.

— Mutta, äiti kulta, minä tarvitsen nuo rahat, kuuletko, minä


tarvitsen! Minä olen mennyt mies ilman niitä.

Mutta äiti ei kuullut häntä. Hänkin tarvitsi rahoja.

— Mihin?

Äidin syntymäpäivä oli lähestymässä. Se oli luultavasti oleva


hänen viimeisensä. Hän tahtoi sen niin mielellään viettää entiseen
tapaan, vieraiden ja kaupunkivehnästen, viinin ja hyytelön kanssa.
Sitä ei oltu vietetty niin isän kuolemasta saakka. Köyhyys oli estänyt
häntä. Pitäjän herrasväki ei koskaan ollut sen jälkeen kokoutunut
tähän matalaan kotiin. Hän itse ei ollut koskaan saanut enää liikkua
pitojen emäntänä, vanhassa silkkileningissään, kultakello
kaulassaan. Hennoisiko Erkki nyt kieltää häneltä tuon ilon?

Erkki oli tullut äkkiä aivan kylmäksi. Hänelle oli kaikki lopussa. Hän
meni pöydän luo, otti setelipakan, antoi sen äidin käteen ja sanoi
lujasti ja armottomasti:

— Ota! Ota kaikki!

Sitten syöksyi hän ulos huoneesta. — Äiti kiirehti kätkemään


setelit peiton alle. Vain pari sai Anni pelastaneeksi.

*****

Erkki kulki pitkin lumista maantietä. Koko hänen sisällinen


ihmisensä oli järkytetty. Syvyyden lähteet olivat auenneet hänen
sydämessään ja tuliset kerät hyppelivät hänen silmäinsä edessä. Nyt
hän oli todellakin mennyttä miestä! Siinä se oli hänen ainainen
heikkoutensa! Mitä lempoa hän oli tänne maaseudulle tullutkaan?
Mitä häntä tarvitsi liikuttaa äidin sairauden, mitä kodin ja veren
siteiden? Miksi hän ei ollut kerrassaan jo aikoja sitten voinut rikkoa
niitä velvollisuuksia, joita hän ei kuitenkaan kyennyt täyttämään?

Päivä paistoi pitkin kimmeltäviä hankia, puut loivat sinertäviä


varjoja lumelle. Oli ilmassa kevään tuntua, taivas oli kirkas ja korkea,
pajupensas tien ohessa näki valkoisia unia. — Mutta hänen
mielensä oli katkera ja kova.

Kevät koittaisi kyllä, puut lehtisi, järvet jäättöminä kimaltelisi…


Hänelle yksin ei kevät enää koskaan koittaisi. Ei ollut hänessä ollut
miestä elämän taisteluun, ei pontta kyllin luonteeksi muodostumaan.
Ei hän ollut koskaan voinut ottaa mitään varmaa, poissulkevaa
kantaa, ei tehdä mitään ratkaisevaa päätöstä, ei polttaa mitään
laivoja takanaan. Siltä väliltä hän oli aina ollut ja siksi hän tulisi myös
ikänsä jäämään — sille välille. Horjunut hän oli kahden eri maailman
välillä ja siksi olivat nämä maailmat hänet vihdoin väliinsä
musertaneet.

Hänkö Annia kohottamaan? — Erkin täytyi sitä muistaessaan


nauraa katkerasti. Ei hän ollut kyennyt edes itseään kohottamaan, ei
luomaan itselleen mitään varmaa yksilöllisyyttä, ei mitään elämän-
ihannetta, jota hän voisi omakseen nimittää. Lainattua se oli kaikki
niinkuin hänen rahansakin, yksi ajatus sieltä, toinen täältä, kirjoista
opittua, sanomalehdistä luettua, kapakan pöytyeissä pureksittua!
Tuulen tuomaa, viiman viemää …

— Ota! Ota kaikki!


Hänkö maailmaa parantamaan? — Jospa hän olisi voinut edes
itsensä parantaa, vapautua vanhoista muistoista, takoa itselleen
rinnan raudasta ja paidan teräksestä, sellaisen, jota taistelossa
tarvittiin. Untuvia hän oli ympärilleen koonnut, unelmista hän oli
sotisopansa luonut, haaveista, joilla ei mitään tosi pohjaa ollut.
Elämän kauneutta hän oli etsinyt ja tavoitellut. Nyt oli elämän rumuus
hänet ympäri piirittänyt.

— Ota! Ota kaikki!

Hänkö myrskyssä seisomaan? — Jospa hän olisi voinut edes


tyynessä seista, jospa edes satamassa säilyä haaksirikosta! Ei olisi
toinen hänen, sijassaan vavissut, ei silmää räpähyttänyt, ottanut
elämältä omansa, vaikka se sitten olisi ollut oman kuolevan äidin
käteen puristettu. Hän vapisi. Pienen vedenalaisen karin hän antoi
kaataa veneensä, särkeä kaikki suunnitelmansa. Raukka hän oli ja
raukka hän oli aina ollut, raukaksi hän oli syntynyt ja raukkana hän
pysyi! Oli ollut hänellä tähän asti vielä pisara ylpeyttä, vaaksa
itseluottamusta, kipinä omanarvon tuntoa. Nyt oli sekin mennyt.

— Ota! Ota kaikki!

Hän käveli kauas, kauas pitkin lumista maantietä, ohi kirkon, ohi
hautausmaan, kohti korpea lähestyvää. Lankesi hämärä hänen
ympärilleen, syttyivät tähdet hänen päänsä päälle. Syttyivät myös
lamput lakeudella, syttyivät taloissa ja etäisissä metsätorpissa. —
Mutta Erkin mieleen hiipi ääretön surumielisyys.

Mitä hän oli ollut ja miksi hän oli elänyt? Mihin pyrkinyt ja mitä
elämässä toimittanut? Kuluttanut hän oli aikansa arkipäiväin
pienessä rähinässä, tuhlannut itsensä, tuhlannut toiveensa ja
työkykynsä. Tyhjä, puusta pudonnut lehti hän oli, valmis hankeen
haudattavaksi …

Jospa hän olisi edes joskus vihannut vakavasti taikka rakastanut


vakavasti, tehnyt oikein hyvää jollekulle taikka tehnyt oikein pahaa!
Jäisi edes joku muisto hänen elämästään, jalanjälki lumelle,
kirjokaan taivaalle… Mutta ei! Tyhjää oli hänen elämänsä ollut ja
sisällötöntä, tuomittu hän oli jäljettömiin häviämään …

Harmaata oli ollut elämä hänen ympärillään ja rumaa, ei ollut


monesti päivä sumun läpi pilkistänyt. Märkä metsä oli hänen
ympärillään itkenyt, huoannut maa liejuinen hänen jalkojensa alla.
Oli sattunut joskus eteen sininen silta, punainen pursi; ollut oli kaikki
jälleen harmaata …

Ei ollut elämä hänelle antanut paljon iloja eikä paljon suruja. Oli
antanut päiviä pääksytellen, iloa vain iltojen siteiksi, surua vain
huomenen huoliksi. Ei ollut elämällä siis häneltä paljoa otettavaa …

Ikävä oli maailma, ikävät ihmiset, ikävät hänen omat ajatuksensa.


Kultaan ja purppuraan hän oli kerran onnensa pukenut; nyt pyöri se
harmaana lankakeränä hänen edessään. Viitsisikö hän sen enää
ottaa ylös, sen kerimisellä kättänsä vaivata?…

Nyt oli hän yhdenvärinen muun maailman kanssa.


III

LEHTIPURJEESSA

Erkki palasi myöhään illalla kotiinsa kauppiaan kutsuista.

Maalaiskirkon tapuli kohosi juhlallisena kohti tummansinertävää


kevättalven taivasta. Kirkon juurella, kinoksien keskellä, nukkuivat
talot, nukkuivat myös hiljaiset metsät niiden ympärillä, kauempana
korpien takana kohosi jälleen taloja ja kirkkoja, nousi lumisia vaaroja,
avautui aavoja järvenselkiä, joita viittatiet risteilivät. — Tähti putosi
siellä, tähti täällä. Yksinäisen kulkijan askeleet narskuivat sileäksi
tallatulla tiellä.

Oli ollut paljon vieraita tuolla kauppiaassa. Piha täynnä ajopelejä,


huoneet tupakansavua ja äänten sorinaa… Hänelle oli pidetty
puhekin, lakkautetun sanomalehden toimittajalle… Kauppias oli tullut
häntä kädestä puristamaan ja kuiskaten tuttavallisesti selittänyt,
mitenkä tässä, juuri tässä hänen samaisessa puotikamarissaan oli
alkanut se uuden ajan edistystyö tällä paikkakunnalla, jonka
hedelmiä hän nyt kaikkialla ympärillään näki. Tässä oli nuorisoseura
perustettu, tässä sen ensimäiset kokoukset pidetty, tässä valittu uusi
kunnallislautakunta ja tässä uusi valtiopäivämies. …
Maanviljelysneuvos oli istuttanut hänet viereensä ja kiihkeällä
kaunopuheisuudella tehnyt tiettäväksi, miten maailmassa ja varsinkin
valtiollisessa maailmassa ei mikään ollut ihmiselle niin tarpeellinen
kuin maltti, ei mikään niinkuin maltti… "piru vieköön, ei mikään
niinkuin maltti", oli hän sanonut ja lyönyt nyrkkiään pöytään, kun
Erkki oli osoittanut heikkoja vastaansanomisen oireita… Vanha
ruotsikkojen vihaaja kirkonisäntä oli jälleen molempia käsiään
levitellen koettanut vakuuttaa Erkkiä siitä, että paras keino osata
oikeaan oli tehdä juuri päinvastoin kuin ruotsinmieliset … jos ne
oikeaan, niin me vasempaan, jos ne vasempaan, niin me oikeaan!
Sillä tavalla ei koskaan erehtyisi. — Kansakoulun opettaja oli
mielipiteiltään anarkisti, "taikka tarvinisti", kuten hän itse sanoi.
Hänen murheensa oli vaan se, etteivät ukot tahtoneet oikein uskoa
kehitysoppiin.

Uudet ajat, uudet tavat! Uudet ihmiset, uudet pyyteet!… Istuivat


ennen sedät keinutuoleissa ja nahkasohviensa kulmissa, polttelivat
pitkiä piippujaan, maistelivat höyryäviä totilasejaan, tarinoivat
terveydestään ja vuodentulon toiveista, ulkomaiden tapahtumista ja
keisarien kruunauksista. Oli mukana pappi, pyylevä mies, oli lukkari,
hänen hyväntahtoinen isänsä, oli viinaan menevä maanmittari ja
nimismies, joka taisi lukemattomia kaskuja. Keskustelukielenä oli
rinnakkain suomi ja ruotsi; sen jälkeen kuin kansakoulunopettaja oli
tullut joukkoon, etupäässä suomi… Mutta hän kuuluikin jo
nuorempaan polveen.

Epäilemättä oli siitä lähtien suuri edistys tapahtunut. Virkamiehet


olivat nykyään vahvoja kansallismielisiä, kansa oli herännyt ja pappi
oli ankara raittiusmies … Kuitenkin tunsi Erkki tällä hetkellä
sanomattomasti kaipaavansa noita vanhoja aikoja. Oli ollut niin
rauhallista ja tukevaa silloin istua äänetönnä syrjässä ja kuunnella…
mieliala oli ollut eheämpi, seura kokonaisempi. Nyt sitä vastoin…
kirjavaa seuraa… kirjavia ihmisiä. Kaikki ne olivat sitäpaitsi tulleet
heti esittämään veljen maljaa.

Tämähän on suoraa taantumusta! ajatteli Erkki hymyillen


itsekseen. Varsin sopimattomia mielikuvia vapaamielisen lehden
toimittajalle… Mitähän veikot siellä Helsingissä sanoisivatkaan?…
Mutta sitten muisti hän, että hänen lehtensä olikin lakkautettu ja että
hän itse ei luultavasti enää ollenkaan pääkaupunkiin palajaisi…
Nämä olivat päinvastoin hyvin soveliaita ajatuksia sille, joka
luultavasti tulisi ikänsä maaseudun hiljaisuudessa viettämään.

Lapsuuden muistot, kerran herättyään, eivät enää jättäneet Erkkiä.


Ne seurasivat hänen askeleitaan talvi-öisellä tiellä, seurasivat ohi
kirkon, ohi hautausmaan, kohti kotia lähestyvää. Hän muisti isänsä,
muisti kultaisen emonsa, muisti huolettomat kouluajat ja ensimäiset
askeleensa elämässä … Hänestä tuntui kuin olisivat päivät silloin
olleet pitemmät ja ihmiset iloisemmat, päivänlaskut laupiaammat,
koriammat huomenkoitot.

"Toisin silloin touko kasvoi, toisin maa orahan otti."

Hän mahtoi itsekin olla silloin toinen, — minkälainen, sitä ei Erkki


enää oikein tarkoin muistanut, ainoastaan, että hän oli ollut
reippaampi ja iloisempi… ei juuri iloisempikaan, mutta itseensä
tyytyväisempi. Oli ollut keveämpi elää. — Mielikuvat tulivat ja
menivät.

Yksi kohosi muita korkeammalle … Sata oli lintua metsässä; yksi


lauloi muita kauniimmasti… Tuhat oli tähteä taivaalla; yksi kimmelsi
muita kirkkaammasti … Monta oli luotoa merellä; yksi oli paasi kullan
paistavainen.
Siitä oli monta, monta vuotta. Tuskin hän enää itsekään aivan
tarkkaan muisti, milloin se oli, mutta se mahtoi olla jossakin koulun
yläluokilla. Hän oli lähtenyt yksin selän siintävän ylitse tuijottamaan,
pystyttänyt lehtipurjeen veneensä kokkaan ja jättäytynyt aaltojen
ajeltavaksi. Tuuli oli tuonut purtta, viima vienyt, ulappa oli paistanut,
vaarat taivaan rannalla sinertäneet. Hän oli makaillut päiväkaudet
alastonna asumattomien saarten somerossa ja jälleen antanut
veneen vieriä kohti kauaksi väistyviä lahdenpoukamia, joissa hän ei
ollut koskaan käynyt. Yönsä, kesäiset, valkeat yöt, hän oli levännyt
heinäladoissa, vetänyt veneensä karskuvalle hiekalle, kulkenut yli
kasteisen niityn, nukkunut nuorten heinien ritinään ja herännyt
katsomaan seinänraosta kuppelehtavia jäniksiä, jotka ladon ovella
aamun kultaisen ruskossa iloaan pitivät. Hän oli ottanut osaa
nuottamiesten kalakesteihin lehtoisten nienten nenissä ja tehnyt
talkoolla heinää suurissa talonpoikaistaloissa. Hän oli ollut onnen
matkamies.

Lehtipurjeessa, lehtipurjeessa!

Oli tullut ehtoosta ja aamusta jälleen uusi päivä. Kuinka mones se


hänen matkallaan oli ollut, sitä hän ei itsekään enää muistanut, sillä
vaikka hänen matkansa oli kestänyt tuskin viikkoa enempää, tuntui
se hänestä kuukausilta ja vuosilta… Hän oli Väinämöinen, joka
merta melasteli etsien vain nientä nimetöntä sitä asuakseen, hän oli
merirosvo-laivuri, joka ajeli rauhallisia kuorma-aluksia, orava, joka
purjehti kaarnapurrella, vieraiden maiden kuningas, joka kuljetti
kullalleen purren täyden kultia ja hopeita. Hän oli milloin mitäkin… ja
kaikkialla, kussa hän kulki, tehtiin heinää ja kohosivat tyynet
tervahaudan-savut, kaikkialla paistoi päivä ja kuulti kultaiset
rantahiekat.
Haihtuneet olivat hänen mielestään koti ja äiti, koulukaupunki, sen
ilot ja surut. Hän tuskin muisti enää, kuka hän oli ja minne hän meni.
Hän oli kokonaan sulanut yhteen ympäröivän luonnon kanssa. Hän
oli näiden nienten, saarien ja selkäin alkuasukas, koko tämän
päivänpaistaman järvimaailman haltia itse, kesän henki, joka kulki
vetten päällä… Kun hän joskus niittylähteen yli päänsä kallisti taikka
näki kuvansa tyynessä rantavedessä, tuijottivat hänen silmänsä niin
suurina ja itsetiedottomina, että hänestä tuntui turhalta enää
ajatellakaan palata tuonne järven toiselle puolen… Hänen oli jäätävä
tänne, hänen oli elettävä täällä ikänsä, opeteltava ravitsemaan
ruumistaan veden riistalla ja totuttava käymään puolialastonna
salojen hämärässä, vain joku jousella ammutun peuran taikka
keihäällä kaadetun karhun talja verhonaan … Kaikki villi-ihmisen
vaistot olivat hänessä heränneet. Aamuin ja illoin hän teki uhrinsa
auringolle, hän kuuli ruohon kasvavan ja ymmärsi, mitä västäräkki
hänen veneensä kokassa visersi, sillä aikaa kuin hän itse sen
pohjassa lepäsi ja katseli sinistä ja valkoista taivasta …

Hän oli metsien erakko, joka tajusi elämän salaisuuden, salojärven


tietäjä, joka odotti vain totuudenjanoisia, kirkassilmäisiä opetuslapsia
tullakseen uusien uskontojen perustajaksi. Maailmankatsomuksensa
hän muodosti lyhyiksi, ytimekkäiksi viisauden sanoiksi, joita hän
piirteli käyristyneille tuohipalasille — hiilellä, jonka hän oli ottanut
tervamiesten yötulilta — ja aavistuksensa salatuista asioista hän
kätki kivien ja kantojen alle, josta syntymättömät sukupolvet tulisivat
ne nimettömänä, suuren tuntemattoman lahjana löytämään!

Lehtipurjeessa, lehtipurjeessa!

Anni tuli hänelle ovea aukaisemaan. Hän oli heittänyt ympärilleen


saalin ja Erkki näki, että hän jo oli ollut nukkumassa.
— Oliko hauskaa kauppiaassa?

— Niinkuin tuossa.

He astuivat äänettöminä saliin. Anni nukkui keittiössä taikka,


milloin äiti oli huonompi, hänen kanssaan kamarissa. Hän asetti
kynttilän kädestään pöydälle, katsoi vielä kerran, että kaikki oli
paikoillaan yöpöydällä Erkin vuoteen vieressä, ja kääntyi sitten
keittiöön mennäkseen.

— Hyvää yötä sitten.

— Nukuttaako sinua?

— Eipä erityisesti.

— Tahdotko lasin viiniä?

Anni näki, että Erkki kaipasi puhekumppania. Se oli tapahtunut


varsin usein viime aikoina. He olivat istuneet monesti myöhään
yöhön salissa ja jutelleet, tavallisesti aivan läheisimmän
ympäristönsä asioista, äidin sairaudesta ja muusta. Mutta he olivat
täten kuitenkin jossakin määrin lähestyneet toisiaan. Anni näki, että
Erkki ikäänkuin pelkäsi olla yksin, ja piti sentähden mielelläänkin
seuraa hänelle. Erkki olikin viime aikoina käynyt niin
synkkämieliseksi.

Mitä oli Erkki Annille? Ei paljoa. Myöskin vaan hämärä lapsuuden


muisto, hiukan haikea sydämen sylkähdys, jolle hän oli liian viisas
mitään perustaakseen. Oppinut, onnellisempi serkku, päivän lapsi
järven toiselta puolen, puolelta kirkonkylän ja kullankimmeltäväin
ikkunani, sillä aikaa kuin aurinko hänen oman kotinsa takana
synkkään korpeen painui. Oli hänkin kerran kätensä ojentanut… oli
kuroittanut kohden ihalampia ilmanrantoja. Se oli silloin kuin itara isä
oli päästänyt hänet pariksi vuodeksi seminaariin… Nyt oli kaikki
lopussa. Koti oli todellakin sietämätön, isä raaka, äitipuoli röyhkeä…
Hetkeksi edes irtautuakseen ilottomasta elämästään oli hän
saapunut sairasta tätiään hoitamaan. — Täällä hän oli tavannut
Erkin. Se ei ollut häneen mitään suurempaa vaikutusta tehnyt. Häntä
harmittivat vain ne muutamat kulkupuheet pitäjällä, jotka olivat
viittailleet mahdolliseen rakkauteen serkusten välillä … Täällä
ahtaassa maaseudussa ei paljon mokomain juorujen syntymiseen
tarvittu.

Se oli siis kaikin puolin tyyni, viileä ja tervejärkinen nainen, joka


tällä hetkellä Erkkiä vastapäätä soututuolissa istui, samalla kuin
Erkki itse sohvan kulmassa paperossiaan poltteli. Yhtä tyyntä ja
intohimotonta oli heidän keskustelunsakin; sanoivat sanan silloin,
toisen tällöin, ja vaikenivat jälleen… Lääkäri oli käynyt viime viikolla
ja ilmoittanut, ettei äiti voinut elää kesää kauemmaksi. Siitä heillä
puhetta piisasi.

Mutta Erkki katseli Annia kuitenkin tänä iltana eri silmillä kuin
ennen, näki vanhojen muistojensa prisman läpi, jotka tuolla ulkona
tähti-vipajavassa talvi-yössä olivat hänen sielussaan heränneet. Eikä
hän enää millään muotoa tahtonut päästää niitä jälleen katoamaan,
hän koetti väkisin loihtia esiin äskeistä mielialaansa ja väkisin
kehitellä sitä… Anni esiintyi hänelle nyt arvoituksena, joka kerran oli
hänen elämäänsä astunut, mutta jäänyt selittämättä. Eikö voisi sitä
nyt selittää, eikö jälleen mennyttä manata?

Lehtipurjeessa, lehtipurjeessa!

Mutta se ei enää tahtonut mitenkään onnistua. Toiset muistot


tunkivat hänen mieleensä… synkemmät, pimeämmät muistot… Oli
hän kerran teistikin tavannut Annin, markkinoilla, läheisessä
kauppalassa. Mutta silloin ei ollut päivä paistanut eikä kesä
kukoistanut, oli ollut synkkä, sateinen syksypäivä, maa liejuinen, ilma
harmaa… Tuo pieni, vähäpätöinen kauppapaikka oli nyt kuhissut
täynnä kansaa, jota oli saapunut kymmenien peninkulmain takaa,
kadut olivat olleet yhtenä rapakkona… olivat lemunneet miesten
harmajat sarkakauhtanat ja naisten värjätyt juhlavaatteet…
Illemmällä olivat lamput syttyneet kauppapuodeissa ja kojuissa torin
varrella, kadut olivat yhä edelleen olleet täynnä väkeä, humalaiset
olivat reuhanneet, tytöt ja pojat kävelleet hoilaten ja käsi kaulalla…
Oli alkanut ilon roihu niin hurja ja villi, ettei Erkki semmoista
muistanut milloinkaan nähneensä, nälkäkansan juhannuskokko,
korven karnevaali, kaikkien pidätettyjen intohimojen ja arkipäivien
pitkässä, yksitoikkoisessa hämärässä sokaistuneiden viettien
kaamea karuselli… räikeä kuin syksy, ruma kuin loka, saastainen
kuin tämä sateinen, ränsistynyt taloryhmä …

Lehtipurjeessa, lehtipurjeessa!

He olivat tavanneet toisensa erään lautakojun edessä… He olivat


ostaneet namusia ja Erkki oli kihlannut Annin vesirinkilällä… Hekin
olivat tahtoneet leikkiä karnevaalia ja käyneet katsomassa
komeljanttien voimistelunäytteitä, silmänkääntämistä ja
miekannielemistä… He olivat kävelleet keilaradalle kauppalan
läheiseen puistikkoon… Pareja oli pyrähdellyt lentoon märästä,
pimeästä maasta kuin pyitä metsämiehen lähestyessä… Yönsä he
olivat nukkuneet porvarin pienessä, tungokseen ahdetussa pirtissä,
tukahduttavassa ilmassa, juopuneiden rähinässä…

— Erkki! Mitä sinä ajattelet?

— Enpähän erinomaista.
Mutta Anni katseli edelleenkin tutkivasti Erkkiä. Erkin kasvoille oli
noussut niin tuskallinen ilme ja hän hengitti aivan kuuluvasti…
Lieneekö hän ollut sairas? Hän oli joskus ennenkin maininnut
turmiolle menneestä hermostostaan. — Anni tunsi itsensä oikein
levottomaksi.

Mutta Erkki oli jälleen saanut kiini kesäisistä mielikuvistaan. —


Kuinka se oli taas ollutkaan?… Hän oli edellisenä iltana joutunut
myrskyyn, yöpynyt sanattomaan saareen lähellä mannermaata.
Ohimenevä ukkossade oli hänet kastellut… hän oli seisonut tippuvan
kuusen alla… hän oli vihdoin riisunut vaatteensa, kätkenyt ne
veneen teljon alle ja juoksennellut alastomana vesisateessa
kahakäteen pitkin karheata jäkäläkangasta… Hänen oli tullut kylmä,
hän oli heittänyt kieppiä pihkaisten puiden oksissa ja kalkutellut
suuria kiviä päänsä päällä yhteen. Lopuksi oli hän jälleen pukenut
vaatteet päälleen, istunut läpi märkänä, lokattavin leuoin ranta-
äyrään suojassa, luistavalla kalliolla, johon sadevesi pitkin puiden
juuria valui, mutta jossa hän kuitenkin oli turvattu taivaasta tulvivalta
saavinkaadolta… Siinä oli hän istunut vaipuneena hiljaiseen
mietiskelyyn, edessänsä tuhansia pikku kirppuja ponnahutteleva
vedenpinta ja takanaan sankea, ropiseva metsä, jota humahtelevat
tuulenpuuskat avasivat ja sulkivat kuin lukkoa…

Lehtipurjeessa, lehtipurjeessa!

Vasta seuraavan päivän ikäpuolella oli hän päässyt sieltä


mannermaalle luovimaan. Hän oli ollut silloin niin väsynyt, että hän
oli heti vaipunut sikeään uneen päivän lämmittämille rantakiville;
vene oli jäänyt kauaksi matalikolle… Kun hän heräsi, oli yö. Tuuli oli
hiljennyt melkein tuntumattomaksi… vain laineiden läikkä ja silloin
tällöin lehahtavat koivut muistuttivat menneestä myrskystä.
Hän nousi, oikoi jäykistyneet jäsenensä, pistäysi rantaveräjästä ja
taittoi aitovierellä kasvavasta metsäruusupensaasta kukan
napinläpeensä… Häämöitti talo törmältä, sinne kapea polku poikki
viettävän pellon … Hän kulki, kohosi jälleen veräjästä, sivuutti
saunan, kiersi pirtin nurkan, tuli pihalle… Ei kuulunut hallia
haukahtavaksi, ei karjankelloa kalahtavaksi…

Pirtin ovi oli lukossa. Hän kolisteli, ei kukaan tullut avaamaan. Hän
löi aitan ovelle, sama tulos… Vihdoin ilmestyi saunasta piika
pikkarainen, joka kertoi kaiken talonväen menneen ulkoniitylle. Hän
yksin jäänyt kotimieheksi… Ruislintu narisi, punertava täysikuu
paistoi vinoon yli viljapellon.

— Erkki! Mitä sinä ajattelet?

Erkki tuijotti eteensä niin synkästi ja kamalasti, että Anni tunsi


sydämensä kouristuvan. Mutta ennen kuin hän ehti enempää
ajatella, näki hän Erkin nousevan, tulevan häntä kohti ojennetuin
käsivarsin.

— Erkki, Erkki! Sinä kaadat kynttilän!

Anni vapisi kiireestä kantapäähän. — Erkki oli sulkenut hänet


syliinsä. Hänen toinen kätensä kiersi Annin vartta, toinen koetti
tunkeutua saalin alle ja tapailla hänen rintojaan, jotka nousivat ja
laskivat kuin aallot. Samassa tunsi Anni huulensa musertuvan
väkivaltaisesta suudelmasta.

— Erkki!

— Minä rakastan sinua.


Kynttilä sytytti kaatuessaan harvat ikkunaverhot. Ne roihahtivat
tuleen ja sammuivat samassa. Hetkellinen tulenloisto heijastui
huoneesen, siitä ulos talviseen pimeyteen, valaisi silmänräpäykseksi
lumisen pihamaan ja ulkohuoneiden seinän. Sitten ei enää näkynyt
mitään.

— Erkki!

Viereisestä huoneesta kuului raskas kolahdus. He raapaisivat tulta


ja huomasivat oven olevan raollaan äidin kamariin. He kiirehtivät
sinne ja tapasivat äidin taintuneena oven edessä. He nostivat hänet
sänkyyn ja saivat kauan turhaan häntä henkiin virotella.
IV

DE PROFUNDIS

Äidin syntymäpäivä lähestyi. Äiti oli ihmeellisesti voimistunut. Hän


oli kaiket päivät jalkeilla, hän tunsi itsensä jälleen pitojen emännäksi,
hän oli tyytyväinen ja laski leikkiä, pesi ja puuhasi, leipoi ja kirkasti
astioita aivan kuin entisinä suuruutensa aikoina. Ylenluonnollinen
toimeliaisuuden henki oli ottanut häneen asuntonsa.

Mutta Erkistä tuntui aivan kuin olisi äiti puuhannut omia peijaitaan.

Hän itse, Erkki, sai muuttaa milloin salista kamariin, milloin


kamarista saliin. Siellä lakaistiin, pestiin, pölyytettiin ja tuuletettiin,
vanhat valokuva-albumit haettiin esille, vanhat nimipäiväkortit
järjestettiin vadeilleen. Kun odotettu päivä vihdoin koitti, kiilti ja kuutti
lukkarinmuorin pieni, punaiseksi maalattu tupa maantien varrella
niinkuin nukkekaappi kuninkaan linnassa. Kynttilät sytytettiin, lamput
pantiin eteiseen palamaan, itse istui lukkarinmuori sohvaan
vanhassa silkkileningissään, joka nyt oli käynyt hänelle niin väljäksi,
niin väljäksi. Erkki istui keinutuolissa hänen vierellään, Anni kilisteli
keittiössä astioita. — Kaikki Erkin kirjat olivat korjatut piiloon, samoin
äidin rohtopullot; sänky, joka oli ollut vuosikaudet levällään
kamarissa, oli nyt vedetty yhteen. Mikään ei muistuttanut, että tämä
pieni talo oli sairashuone ja että täällä asui kaksi sairasta sielua.

Saliin piti naisten kokoontua, kamari oli määrätty herrojen toti- ja


tupakkahuoneeksi. Oven piti olla auki molempain välillä niinkuin aina
ennenkin isän eläessä. Marmelaatia oli pienillä aseteilla pöytien ja
piironkien päällä, lukkarin vanha piippuhylly oli jälleen päässyt
arvoonsa; paperosseja ja sikaareja oli hankittu monta eri lajia
läheisestä kauppalasta. Näin varustettuna, oppinut poikansa
sivullaan, odotti vanha lukkarinmuori vieraitaan, haalistunut
silkkileninki yllään, kultasormus sormessa, josta se aina tahtoi
tipahtaa, ja kultakäädyt kaulassa. Se oli todellakin mitä juhlallisin ja
liikuttavin näky.

Erkki ei tiennyt, pitikö hänen itkeä vai nauraa. Hän oli viime aikoina
todellakin ruvennut pelkäämään järkeään; alituinen ilkeä
päänkivistys vaivasi häntä. Kaamea tyhjyyden tunne oli täyttänyt
hänet ja kaikki ulkopuoliset vaikutukset kurkistivat sisälle hänen
sielunsa ikkunoista kuin kummitukset autioon huoneesen.

Vierasjoukko oli hiukan eri kuin kauppiaan luona. Oli kömpinyt


esiin joukko vanhoja tätejä, joita Erkki ei ollut kymmeneen vuoteen
nähnyt. Kaikki ne olivat melkein yhtä laihoja kuin äiti ja kaikki
tirkistelivät ne nyt ympärilleen kuin myyrät päivänpaisteessa. —
Aluksi meni kaikki hyvin. Vieraat, jotka olivat tulleet hiipien ja vilkuen
kummallekin kupeelleen, koteutuivat vähitellen. Tarjottiin viiniä,
tarjottiin makeisia. Naiset olivat pian saaneet sananvaihdon aikaan ja
herrat istuivat jo tyytyväisinä totilasiensa ääressä. — Erkki oli mitä
kohteliain isäntä, tarjosi tupakkaa, käski panemaan "toiselle jalalle",
kävi kilistämässä naisten kanssa ja istui heille hetkiseksi seuraa
pitämään. Mutta hän liikkui niinkuin automaatti ja hän näki kaikki kuin
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookmass.com

You might also like