Abraham Almonte hit his first major league homer, a two-run shot in the seventh inning, to give the Mariners a 3-2 lead. Seattle reliever Charlie Furbush got out of a jam in the eighth, but in the ninth the Astros broke through.
Danny Farquhar (0-3) walked Marc Krauss and Carlos Corporan with one out, and Jimmy Paredes' run-scoring single tied the game at 3. Villar then gave Houston a two-run lead with his hit to center.
It was the fourth blown save of the season for Farquhar, but only his second in the closer role.
Kevin Chapman (1-1) pitched a scoreless eighth to earn the win, and Josh Fields pitched the ninth for his fourth save in five chances despite giving up a solo homer to Brad Miller.
The Astros added a fourth run in the ninth in bizarre fashion. With runners on second and third and one out, Trevor Crowe fouled out to first baseman Justin Smoak, but Smoak's throw to the plate hit Crowe crouched in foul territory and bounced away, allowing Villar to score.
The announced attendance of 9,808 was 10 fewer than the previous low at the 14-year-old park, set April 29 against the Orioles. Before this season, the previous low was 11,352 a mark set April 18, 2012, against Cleveland. This year, the Mariners have drawn fewer than that number five times.
Seattle starter Taijuan Walker ended his brief inaugural major league season with a no-decision despite striking out eight over five innings and retiring the final nine batters he faced. The Mariners said leading up to the game it would be Walker's final appearance since he had thrown 151 1-3 inning between his minor and major league starts going into Monday's outing.
Two of his three starts in the majors have been against Houston. Walker picked up the win in his debut on Aug. 30, allowing one run on two hits, but this time the Astros picked up a pair of runs off five hits. Paredes drove in the first with a sacrifice fly in the second, and Jose Altuve and Crowe opened the third with back-to-back doubles to give the Astros a 2-1 lead.
Seattle's pitchers retired the next 15 batters but Carter Capps got into a jam in the eighth before Furbush bailed him out. Furbush came on with one out, runners on second and third, and the Mariners clinging to their 3-2 lead. He struck out pinch-hitter Brandon Laird and got Matt Dominguez to ground out to preserve the lead.
Houston starter Jarred Cosart gave up an unearned run on two hits, struck out three.
Seattle's lone run against Cosart came in the first inning on a throwing error by Villar at shortstop. Houston manager Bo Porter said before the game Cosart would be limited to five innings, unless he had a no-hitter or a shutout going. Apparently the fact the only run was unearned wasn't enough to sway Porter's decision making, as reliever Josh Zeid came on in the sixth, and in the seventh the Astro's bullpen gave up the lead, as Chia-Jen Lo gave up the one-out, two-run homer to Almonte setting up the late rally.
NOTES: Seattle ace Felix Hernandez will not make his scheduled start on Wednesday, the second time his turn in the rotation has been pushed back due to soreness. "I guess you'd call it a minor oblique strain on the left side, if you had to put a label on it, but it was more just stiffness," manager Eric Wedge said. Hernandez will throw from flat ground at the end of the week when the team travels to St. Louis. ... The Astros reinstated C Carlos Corporan from the seven-day concussion disabled list before the game and he started at catcher.