Saturday, September 12, 2020

Tech Book Face Off: Data Smart Vs. Python Machine Learning

After reading a few books on data science and a little bit about machine learning, I felt it was time to round out my studies in these subjects with a couple more books. I was hoping to get some more exposure to implementing different machine learning algorithms as well as diving deeper into how to effectively use the different Python tools for machine learning, and these two books seemed to fit the bill. The first book with the upside-down face, Data Smart: Using Data Science to Transform Data Into Insight by John W. Foreman, looked like it would fulfill the former goal and do it all in Excel, oddly enough. The second book with the right side-up face, Python Machine Learning: Machine Learning and Deep Learning with Python, scikit-learn, and TensorFlow by Sebastian Raschka and Vahid Mirjalili, promised to address the second goal. Let's see how these two books complement each other and move the reader toward a better understanding of machine learning.

Data Smart front coverVS.Python Machine Learning front cover

Data Smart

I must admit; I was somewhat hesitant to get this book. I was worried that presenting everything in Excel would be a bit too simple to really learn much about data science, but I needn't have been concerned. This book was an excellent read for multiple reasons, not least of which is that Foreman is a highly entertaining writer. His witty quips about everything from middle school dances to Target predicting teen pregnancies were a great motivator to keep me reading along, and more than once I caught myself chuckling out loud at an unexpectedly absurd reference.

It was refreshing to read a book about data science that didn't take itself seriously and added a bit of levity to an otherwise dry (interesting, but dry) subject. Even though it was lighthearted, the book was not a joke. It had an intensity to the material that was surprising given the medium through which it was presented. Spreadsheets turned out to be a great way to show how these algorithms are built up, and you can look through the columns and rows to see how each step of each calculation is performed. Conditional formatting helps guide understanding by highlighting outliers and important contrasts in the rows of data. Excel may not be the best choice for crunching hundreds of thousands of entries in an industrial-scale model, but for learning how those models actually work, I'm convinced that it was a worthy choice.

The book starts out with a little introduction that describes what you got yourself into and justifies the choice of Excel for those of us that were a bit leery. The first chapter gives a quick tour of the important parts of Excel that are going to be used throughout the book—a skim-worthy chapter. The first real chapter jumps into explaining how to build up a k-means cluster model for the highly critical task of grouping people on a middle school dance floor. Like most of the rest of the chapters, this one starts out easy, but ramps up the difficulty so that by the end we're clustering subscribers for email marketing with a dozen or so dimensions to the data.

Chapter 3 switches gears from an unsupervised to a supervised learning model with naïve Bayes for classifying tweets about Mandrill the product vs. the animal vs. the Mega Man X character. Here we can see how irreverent, but on-point Foreman is with his explanations:
Because naïve Bayes is often called "idiot's Bayes." As you'll see, you get to make lots of sloppy, idiotic assumptions about your data, and it still works! It's like the splatter-paint of AI models, and because it's so simple and easy to implement (it can be done in 50 lines of code), companies use it all the time for simple classification jobs.
Every chapter is like this and better. You never know what Foreman's going to say next, but you quickly expect it to be entertaining. Case in point, the next chapter is on optimization modeling using an example of, what else, commercial-scale orange juice mixing. It's just wild; you can't make this stuff up. Well, Foreman can make it up, it seems. The examples weren't just whimsical and funny, they were solid examples that built up throughout the chapter to show multiple levels of complexity for each model. I was constantly impressed with the instructional value of these examples, and how working through them really helped in understanding what to look for to improve the model and how to make it work.

After optimization came another dive into cluster analysis, but this time using network graphs to analyze wholesale wine purchasing data. This model was new to me, and a fascinating way to use graphs to figure out closely related nodes. The next chapter moved on to regression, both linear and non-linear varieties, and this happens to be the Target-pregnancy example. It was super interesting to see how to conform the purchasing data to a linear model and then run the regression on it to analyze the data. Foreman also had some good advice tucked away in this chapter on data vs. models:
You get more bang for your buck spending your time on selecting good data and features than models. For example, in the problem I outlined in this chapter, you'd be better served testing out possible new features like "customer ceased to buy lunch meat for fear of listeriosis" and making sure your training data was perfect than you would be testing out a neural net on your old training data.

Why? Because the phrase "garbage in, garbage out" has never been more applicable to any field than AI. No AI model is a miracle worker; it can't take terrible data and magically know how to use that data. So do your AI model a favor and give it the best and most creative features you can find.
As I've learned in the other data science books, so much of data analysis is about cleaning and munging the data. Running the model(s) doesn't take much time at all.
We're into chapter 7 now with ensemble models. This technique takes a bunch of simple, crappy models and improves their performance by putting them to a vote. The same pregnancy data was used from the last chapter, but with this different modeling approach, it's a new example. The next chapter introduces forecasting models by attempting to forecast sales for a new business in sword-smithing. This example was exceptionally good at showing the build-up from a simple exponential smoothing model to a trend-corrected model and then to a seasonally-corrected cyclic model all for forecasting sword sales.

The next chapter was on detecting outliers. In this case, the outliers were exceptionally good or exceptionally bad call center employees even though the bad employees didn't fall below any individual firing thresholds on their performance ratings. It was another excellent example to cap off a whole series of very well thought out and well executed examples. There was one more chapter on how to do some of these models in R, but I skipped it. I'm not interested in R, since I would just use Python, and this chapter seemed out of place with all the spreadsheet work in the rest of the book.

What else can I say? This book was awesome. Every example of every model was deep, involved, and appropriate for learning the ins and outs of that particular model. The writing was funny and engaging, and it was clear that Foreman put a ton of thought and energy into this book. I highly recommend it to anyone wanting to learn the inner workings of some of the standard data science models.

Python Machine Learning

This is a fairly long book, certainly longer than most books I've read recently, and a pretty thorough and detailed introduction to machine learning with Python. It's a melding of a couple other good books I've read, containing quite a few machine learning algorithms that are built up from scratch in Python a la Data Science from Scratch, and showing how to use the same algorithms with scikit-learn and TensorFlow a la the Python Data Science Handbook. The text is methodical and deliberate, describing each algorithm clearly and carefully, and giving precise explanations for how each algorithm is designed and what their trade-offs and shortcomings are.

As long as you're comfortable with linear algebraic notation, this book is a straightforward read. It's not exactly easy, but it never takes off into the stratosphere with the difficulty level. The authors also assume you already know Python, so they don't waste any time on the language, instead packing the book completely full of machine learning stuff. The shorter first chapter still does the introductory tour of what machine learning is and how to install the correct Python environment and libraries that will be used in the rest of the book. The next chapter kicks us off with our first algorithm, showing how to implement a perceptron classifier as a mathematical model, as Python code, and then using scikit-learn. This basic sequence is followed for most of the algorithms in the book, and it works well to smooth out the reader's understanding of each one. Model performance characteristics, training insights, and decisions about when to use the model are highlighted throughout the chapter.

Chapter 3 delves deeper into perceptrons by looking at different decision functions that can be used for the output of the perceptron model, and how they could be used for more things beyond just labeling each input with a specific class as described here:
In fact, there are many applications where we are not only interested in the predicted class labels, but where the estimation of the class-membership probability is particularly useful (the output of the sigmoid function prior to applying the threshold function). Logistic regression is used in weather forecasting, for example, not only to predict if it will rain on a particular day but also to report the chance of rain. Similarly, logistic regression can be used to predict the chance that a patient has a particular disease given certain symptoms, which is why logistic regression enjoys great popularity in the field of medicine.
The sigmoid function is a fundamental tool in machine learning, and it comes up again and again in the book. Midway through the chapter, they introduce three new algorithms: support vector machines (SVM), decision trees, and K-nearest neighbors. This is the first chapter where we see an odd organization of topics. It seems like the first part of the chapter really belonged with chapter 2, but including it here instead probably balanced chapter length better. Chapter length was quite even throughout the book, and there were several cases like this where topics were spliced and diced between chapters. It didn't hurt the flow much on a complete read-through, but it would likely make going back and finding things more difficult.

The next chapter switches gears and looks at how to generate good training sets with data preprocessing, and how to train a model effectively without overfitting using regularization. Regularization is a way to systematically penalize the model for assigning large weights that would lead to memorizing the training data during training. Another way to avoid overfitting is to use ensemble learning with a model like random forests, which are introduced in this chapter as well. The following chapter looks at how to do dimensionality reduction, both unsupervised with principal component analysis (PCA) and supervised with linear discriminant analysis (LDA).

Chapter 6 comes back to how to train your dragon…I mean model…by tuning the hyperparameters of the model. The hyperparameters are just the settings of the model, like what its decision function is or how fast its learning rate is. It's important during this tuning that you don't pick hyperparameters that are just best at identifying the test set, as the authors explain:
A better way of using the holdout method for model selection is to separate the data into three parts: a training set, a validation set, and a test set. The training set is used to fit the different models, and the performance on the validation set is then used for the model selection. The advantage of having a test set that the model hasn't seen before during the training and model selection steps is that we can obtain a less biased estimate of its ability to generalize to new data.
It seems odd that a separate test set isn't enough, but it's true. Training a machine isn't as simple as it looks. Anyway, the next chapter circles back to ensemble learning with a more detailed look at bagging and boosting. (Machine learning has such creative names for things, doesn't it?) I'll leave the explanations to the book and get on with the review, so the next chapter works through an extended example application to do sentiment analysis of IMDb movie reviews. It's kind of a neat trick, and it uses everything we've learned so far together in one model instead of piecemeal with little stub examples. Chapter 9 continues the example with a little web application for submitting new reviews to the model we trained in the previous chapter. The trained model will predict whether the submitted review is positive or negative. This chapter felt a bit out of place, but it was fine for showing how to use a model in a (semi-)real application.

Chapter 10 covers regression analysis in more depth with single and multiple linear and nonlinear regression. Some of this stuff has been seen in previous chapters, and indeed, the cross-referencing starts to get a bit annoying at this point. Every single time a topic comes up that's covered somewhere else, it gets a reference with the full section name attached. I'm not sure how I feel about this in general. It's nice to be reminded of things that you've read about hundreds of pages back and I've read books that are more confusing for not having done enough of this linking, but it does get tedious when the immediately preceding sections are referenced repeatedly. The next chapter is similar with a deeper look at unsupervised clustering algorithms. The new k-means algorithm is introduced, but it's compared against algorithms covered in chapter 3. This chapter also covers how we can decide if the number of clusters chosen is appropriate for the data, something that's not so easy for high-dimensional data.

Now that we're two-thirds of the way through the book, we come to the elephant in the machine learning room, the multilayer artificial neural network. These networks are built up from perceptrons with various activation functions:
However, logistic activation functions can be problematic if we have highly negative input since the output of the sigmoid function would be close to zero in this case. If the sigmoid function returns output that are close to zero, the neural network would learn very slowly and it becomes more likely that it gets trapped in the local minima during training. This is why people often prefer a hyperbolic tangent as an activation function in hidden layers.
And they're trained with various types of back-propagation. Chapter 12 shows how to implement neural networks from scratch, and chapter 13 shows how to do it with TensorFlow, where the network can end up running on the graphics card supercomputer inside your PC. Since TensorFlow is a complex beast, chapter 14 gets into the nitty gritty details of what all the pieces of code do for implementation of the handwritten digit identifier we saw in the last chapter. This is all very cool stuff, and after learning a bit about how to do the CUDA programming that's behind this library with CUDA by Example, I have a decent appreciation for what Google has done with making it as flexible, performant, and user-friendly as they can. It's not simple by any means, but it's as complex as it needs to be. Probably.

The last two chapters look at two more types of neural networks: the deep convolutional neural network (CNN) and the recurrent neural network (RNN). The CNN does the same hand-written digit classification as before, but of course does it better. The RNN is a network that's used for sequential and time-series data, and in this case, it was used in two examples. The first example was another implementation of the sentiment analyzer for IMDb movie reviews, and it ended up performing similarly to the regression classifier that we used back in chapter 8. The second example was for how to train an RNN with Shakespeare's Hamlet to generate similar text. It sounds cool, but frankly, it was pretty disappointing for the last example of the most complicated network in a machine learning book. It generated mostly garbage and was just a let-down at the end of the book.

Even though this book had a few issues, like tedious code duplication and explanations in places, the annoying cross-referencing, and the out-of-place chapter 9, it was a solid book on machine learning. I got a ton out of going through the implementations of each of the machine learning algorithms, and wherever the topics started to stray into more in-depth material, the authors provided references to the papers and textbooks that contained the necessary details. Python Machine Learning is a solid introductory text on the fundamental machine learning algorithms, both in how they work mathematically how they're implemented in Python, and how to use them with scikit-learn and TensorFlow.


Of these two books, Data Smart is a definite-read if you're at all interested in data science. It does a great job of showing how the basic data analysis algorithms work using the surprisingly effect method of laying out all of the calculations in spreadsheets, and doing it with good humor. Python Machine Learning is also worth a look if you want to delve into machine learning models, see how they would be implemented in Python, and learn how to use those same models effectively with scikit-learn and TensorFlow. It may not be the best book on the topic, but it's a solid entry and covers quite a lot of material thoroughly. I was happy with how it rounded out my knowledge of machine learning.

Missed Classic: Moonmist - Representation Blues

Written by Joe Pranevich


I intended to wrap up Moonmist this week by closing out on the three remaining cases then moving quickly to the final rating. I did not make it. When playing and reviewing, I try to come to these games as unspoiled as I can. I learn what I need to discuss the history and place the game in context, but I avoid spoiling the plots and puzzles as much as I can. Usually that works, but in this case I missed one of the things that Moonmist is most remembered for: it is (supposedly) the first computer game to feature LGBT characters. I disagree with that assessment, but we'll get there soon enough. It seems poor form for me to review this game, in Pride Month of all times, without giving space to discuss this important aspect of gaming history.

This week, I'm looking at the "blue" variant of Moonmist, the second one listed in the manual. (I finished "red" last week.) To the best of my knowledge, this is the only version that includes a LGBT-related plotline, but I have not played the others yet. I will take a quick look at LGBT representation in media more broadly into the 1980s and then dive into whether or not this game deserves its spot as the "first". Of course, I'll also be playing and solving the mystery itself! I hope that the final two variations don't have more surprises that lead to hours of research and introspection. Read on for more.

Boston Pride in the mid-1980s.

I am not an expert on LGBT issues in pop culture and I encourage our commenters to tell me all of the details that I am sure to be missing. As a child of the 1980s, I grew up steeped in the stereotypes that pervaded America when this game was written. Jim Lawrence and Stu Galley are older still and grew up with the stereotypes that they picked up from the media of their day. Those attitudes stemmed from even earlier depictions in books and film. Attitudes are far from unchanging, but each successive generation carries a bit of the baggage of the previous.

At least in the United States, one of the ways in which pop culture shaped attitudes towards homosexuality is through the "Hays Code", or more properly the "Motion Picture Production Code". That is not to say that discrimination didn't exist before-- that code itself was a product of generational attitudes-- but it codified (for film) a set of rules that was followed from the 1930s through the 1960s and persisted even later through the threat of boycotts and self-censorship. Similar codes existed in other media, but it is undeniable that the Hays Code helped to reinforce the way "average" Americans felt about certain issues. This is not limited to homosexuality! These rules banned depictions of inter-racial relationships, criticism of religion, pre-marital sex, and many other things. You could not portray a criminal as sympathetic. You had to show respect for law enforcement. Homosexuality, considered a "sexual perversion", could be depicted only as a trait of a villain. LGBT characters in these films were murders and sadists brought to justice, or emotionally challenged individuals prone to suicide. Gay character traits became associated with villany. Long after the Hays Code fell out of favor, these tropes remained in use, burned into society's collective unconscious.

It was Mr. Green with the (suggestive) pipe!

To take one small example, I looked last week at the film Clue and how it may have inspired Moonmist by featuring multiple endings. In that film, Mr. Green is depicted as a gay man who lives in constant fear of being discovered and losing his job at the State Department. This makes him an easy target for extortion. He's a bumbling fool, although perhaps not much more than others in this comedy-mystery. It is only in the "real" ending of the film that Mr. Green is revealed to be a hero: he's an undercover FBI agent who was working to expose the crimes of Mr. Boddy and the rest of the houseguests, all of whom had murdered someone over the course of the night. (Communism was a "red herring"!) But in that crowning moment of awesomeness, Mr. Green's gayness was stripped away. As the police arrest the guests, Green speaks the final line of the film: "OK Chief, take them away! I'm gonna go home and sleep with my wife!" Even forty years later, LGBT representation in media often falls into established patterns. Gay characters are still often driven to suicide. If they don't do it to themselves, they could be killed by something else, and may be the first in line to be killed in such a way.

I will spoil the ending a bit to say that this Moonmist variant falls right back on these tropes. In the "blue" mystery, Deirdre and Vivien are revealed to have been lovers. Deirdre is bisexual and torn between her love for a man (Lord Jack) and Vivien. Ultimately, she surrenders to suicide by jumping in the well in the basement of the castle. In comic book fashion, Vivien swears revenge on the man that took her love away. It is perhaps progressive by including gay characters at all, but these are the same "murderer" and "suicide" options that were all the rage during the Hays Code days.

I love a good Mac adventure.

After all that, was Moonmist really the first video game to include LGBT characters? Unfortunately not. We already saw one example in this very series! Leather Goddesses of Phobos includes a scene where the player character can choose to have sex with one of the titular Goddesses just before the end of the game. Unique across all of the sexual interactions you can have, this is the only one that is not gendered: the Goddesses are female whether you play as a man or a woman. If you choose to go that route, you can prove that your player character is not only bi-curious, but the villains are bisexual as well. They are still murderers and sadists, of course, fitting the evil gay trope exactly, but the game did come out a few months prior to Moonmist.

Another set of examples come from Europe, admittedly in games that most Americans would not have played. Two games by Froggy Software, written in French, feature gay villains:
  • Le crime du parking (1985) - In "The Parking Lot Crime", the villain is a gay drug dealer.
  • Le mur de Berlin va sauter (1985) - In "The Berlin Wall Will Blow Up", the villain is a gay terrorist who wants to destroy the Berlin Wall. Maybe he wasn't all bad?

Not a single one of these games includes a positive depiction of LGBT characters!

To find a positive depiction, we have to turn the clock forward to 1989 and the graphical adventure Caper in the Castro by C. M. Ralph. Following indirectly in the footsteps of ICOM games such as Déjà Vu (1985), it features an on-the-nose detective named Tracker McDyke as she investigates the disappearance of a drag queen friend. She will have to search San Francisco's famous Castro District, one of the most famous and earliest gay neighbothoods in the country, to solve the case. Ralph released the game to help raise money for AIDS-related charities; she also produced a "straight" variant (Murder on Mainstreet) that she expected would garner wider distribution. Once believed lost, this game has been recovered thanks to the efforts of the Internet Archive and Strong Museum of Play. I have added it to my personal "to play" list and hope to dive into it at some point in the future.

Where were we? Oh right, this is supposed to be a post about Moonmist.

I'm blue da ba dee da ba daa.


Playing the Blues

After finishing the first variant last week, I have no idea how the rest of them will go. Will they be mostly the same? Mostly different? How bored will I get if I must explore everything again? For this version, I'm choosing a female character again ("Ms. Blueish"), but I'll use a male one and a "not specified" one for the final two just to see what is different. I will not recap everything that happens; please check out the previous two posts if you need a refresher.

After starting the game and picking my color, the game proceeds as before. The first change comes when I ask Tamara about the ghost. She tells me that she saw the ghost again, this time outside the office brandishing a sword. Tamaram fled back inside and locked the door. After a time, the ghost disappeared and was not seen again.

Just as before, Tamara leads me from room to room to introduce me to the guests. Most of the responses are unmemorable, but Vivien's stand out. Let me quote them in full:

> ask vivien about ghost
She is somber as she replies, "I dare say it was morbid of me but one night I went to the basement, just to try to imagine the horrible scene where poor Deirdre suffered her… tragic accident. Suddenly I heard somebody calling my name softly. I turned 'round and there was Deirdre herself standing by the stairs! I went absolutely numb! She smiled faintly, then fled up the stairs. I started to follow, but then I knew it was no use. Deirdre is dead and gone, and chasing her ghost won't bring her back to me.

> ask vivien about Deirdre
The artist shrugs with a sad, wistful smile. "What can I say? Deirdre was a most unusual girl… utterly unworldly… almost fey. She grew up in a cottage not far from here, you know. Her drowning was a terrible tragedy… and yet… sometimes I'm not sure she WANTED to go on living." She turns her face away to hide a tear.

"Chasing her ghost won't bring her back to me." Does that sound like I think it sounds? Were Vivien and Deirdre together!? That would be an amazing twist, if so. We know that Deirdre was engaged to Jack in all of the versions since it is in the manual text. Was she only with Jack to hide a secret love affair? Or was this something simpler, like a childhood dalliance? And how could a socialite like Deirdre even meet a poor woman that grew up in a nearby cottage? Perhaps her art inspired her to fraternize with the locals? It seems like they would have had quite different social circles.

Something like this?

We are eventually brought to our room to freshen up. Just as before, Bolitho, the butler, stops by for a chat. He also spied the White Lady in this version, except now she was in the New Great Hall and searching on the floor like she needed glasses! The butler also seems to be hinting about how to open the secret passage in my room. The language is exactly the same as before, but I suspect that I just didn't catch on until I learned more about how the passages work. A nice little detail!

I dress and head downstairs for dinner. I get there a few minutes early so I have time to search the New Great Hall on the way. Somehow managing to remain untrampled, I discover a contact lens on the floor. The ghost really did need glasses! Who could it belong to?

The dinner party proceeds as before with the butler leaving a note about the staff leaving, Jack announcing his engagement, and Lionel's recorded voice from beyond the grave surprising his guests with a "scavenger hunt". The first clue is still hidden under the punch bowl, but this time it is a picture of a skeleton in a Chinese Mandarin costume. What could that mean? The second clue is given to Jack this time and it is a rhyming poem with some words missing: 

Three fellows argued about life:
1. 'Using this motto, no chap can go wrong:
Leave the wench and the grape, and go with a _____!
2. 'On the seas of my life is a ship that is laden
Not with bottles or tunes, but with innocent ____s!
3. 'Women and singing are both very fine,
But for me there is nothing to equal good _____!

The answers are simple, especially since the topics are reiterated in all three stanzas: "song", "maiden", and "wine". Thanks to my exploration last time, I know there is a wine cellar in the basement, an iron maiden in the dungeon, and a piano in the sitting room. Plaything through multiple times has advantages!

Since everyone is together, I ask about glasses and the lost contact lens. Would anyone be dumb enough to admit it? Dr. Wendish wears glasses but says that he cannot stand contacts. Hyde wears a monocle. Vivien claims that she cannot tolerate contacts but wears glasses for close-up work in her art. No immediate clues there.

The party moves to the sitting room. I grab the maid's note off the desk and it's the same as before but ends with a strange warning:

Me Dad always says that the first sign of a nut case is when a person starts talking to hisself. Well, if you was to ask me, there is more than ne way to talk to himself. Some does it on paper, and that is the type person to watch out for.

I still hate the fake accented speech. I also have no idea what this means, except that I should be on the lookout for a villain that leaves Post-Its around the mansion documenting his or her crimes.

Armor or Armour? You decide.

Since I am here, I check the piano. Instead of music from A Prairie Home Companion, the piano now has Beethoven's Suite #9 ready to be played. Someone has circled the "SUIT" in the title. That must be a clue! I immediately check the suit of armor in the hall and am rewarded with yet another clue. This is going very quickly! Unfortunately, it isn't quite as self-explanatory as the others:

My al___ has no glamour;
Its '___e' tones do clam___.
Can you find me?

I have no idea what that means so I head down to the wine cellar instead. As expected, I locate a bottle of wine with "OUR" circled on the label. I get cocky and guess that the iron maiden will have an "ARM" label on it someplace, but I am disappointed. Two out of three isn't bad! I'm certain that the clue is just telling me to search the armor, so it is no longer necessary. While exploring, I notice that this time it is Vivien and not Jack who is scouring the house for treasure. Jack is content to let someone else find his family's priceless heirloom? I still do not understand the rules of this scavenger hunt.

It takes only a few minutes of searching to discover a fossil skull hidden in the bell on the roof of the castle. My hint was that the word "clamour" would have rhymed with "glamour" and that was the only clamorous object I could remember. I have no idea what the other blanks are supposed to mean, but it hardly seems to matter now.

A fancy contact lens case from the 1980s.

It's only 9:45 PM! I am making excellent time through the game, but I still need to figure out who the ghost is. With Vivien busy searching the castle, I sneak into her room and search. Inside her art supply box, I discover a contact lens case with a missing contact. Score! Vivien is the ghost, but why? I grab the box and show it to her, but she claims that I planted it in her room to frame her. I try a more direct approach by hiding in the secret passages until the ghost appears. That worked last time and it works again! This time, the White Lady appears armed with a blowgun. I quickly fire the butler's aerosol can at her and she falls to the floor unconscious. I search her to confirm that yes, it is Vivien. Worse, her blowgun contained a real poisoned dart. She was out to kill someone tonight… but who?

I wake Vivien but instead of admitting it all, she sort of sleepwalks to her room. What was in that spray? Once there, she still doesn't admit anything. I show her the ghost costume and she accuses me of planting it! I just caught you in the secret passage! The nerve of some people.

The step that I missed ends up being simple: if I had looked in Vivien's art supply box again after removing the contact lens case, I would have discovered her diary. Reading that reveals a tear-stained page:
O Deirdre, sweet Deirdre! Jack will pay dearly for your cruel death by losing his new sweetheart...

That gives us our motive and we can finally accuse her of being the ghost. Bolitho appears and takes her away. The narrator reveals what really happened:

Vivien was intensely attached to Deirdre, and she jealously hated Lord Jack for coming between them. When Deirdre accidentally fell down the well, Vivien was convinced that she had committed suicide because she felt abandoned by Jack.

So Vivien began her vengeful ghostly masquerade -- to find proof that Jack was responsible for Deirdre's death, to prick his guilty conscience and make him confess, and to terrorize Tamara, who replaced Deirdre in Jack's affections.

This time around, Vivien didn't actually kill anyone. Deirdre's death was an accident rather than a suicide-- although I'm not sure I believe that-- and Vivien wanted revenge on Jack for it. It's all rather complicated. It also means that the maid must have read her diary which also just comes off as creepy, although not as creepy as dressing in a glow-in-the-dark ghost costume. (Yes, you can use it as a light source!) In this version, either Lionel's death was natural or Jack was much better about hiding it.

It actually doesn't seem impossible that, other than the ghost, the stories aren't mutually exclusive. Jack could still have killed Lionel and Deirdre, just as in the "red" version, but this time Deirdre is either really dead or has no interest in coming back to either of her two lovers. Will the rest of the cases fit together as well? We'll have to play them to see.

With luck, next week will really be the Final Rating. Thanks for humoring me through this special look at the "blue" version. Happy Pride!

Time Played: 1 hr 20 min
Total Time: 6 hr 45 min