DEV Community

Juarez Júnior
Juarez Júnior

Posted on • Updated on

IA com C# - Exemplo: Prevendo o Preço de uma Casa

Olá pessoal,

Neste artigo, vamos falar sobre as técnicas de Machine Learning de Regressão Lasso e Ridge. Essas técnicas são variações da Regressão Linear e ajudam a lidar com situações em que temos muitos dados e queremos evitar que o modelo seja muito influenciado por valores extremos ou irrelevantes.

Cenário: Imagine que você está tentando prever o preço de uma casa. O preço pode depender de vários fatores, como o tamanho da casa, o número de quartos, a localização, a idade da casa, entre outros.

Entretanto, nem todos esses fatores têm a mesma importância. Por exemplo, se você incluir muitas variáveis irrelevantes (como a cor da casa ou o dia da semana em que foi colocada à venda), isso pode confundir o modelo. As técnicas de Regressão Lasso e Ridge ajudam a simplificar o modelo, reduzindo a importância de variáveis menos relevantes, o que ajuda a evitar que o modelo fique "exagerado".

Regressão Lasso:
Lasso (Least Absolute Shrinkage and Selection Operator) faz algo interessante: ele elimina o impacto das características menos importantes, reduzindo seu peso até zero. Isso significa que ele pode até eliminar características que não são tão importantes, simplificando o modelo. Pense como uma pessoa fazendo uma mala para uma viagem. Ela quer evitar carregar peso desnecessário, então escolhe apenas os itens mais essenciais e deixa o resto de fora. No final, a mala fica leve e só com o necessário.

Regressão Ridge:
Ridge, por outro lado, reduz o peso das características para que não fiquem muito altos, mas sem eliminá-los completamente. Isso ajuda a garantir que todas as características sejam consideradas, mas sem que qualquer uma delas domine demais a previsão. Imagine que a pessoa do exemplo anterior decidiu levar todos os itens que queria, mas ao invés de excluir qualquer coisa, ela simplesmente distribuiu o peso entre as malas de forma mais equilibrada, para não sobrecarregar uma só.

Como Isso se Aplica:
Suponha que você tenha um conjunto de dados com vários fatores que influenciam o preço de uma casa, como:

  • Tamanho (m²)
  • Número de Quartos
  • Número de Banheiros
  • Idade da Casa
  • Distância até o Centro
  • Número de Supermercados Próximos
  • Dia da Semana em que a Casa Foi Anunciada (essa última é menos relevante)

Ao usar Regressão Lasso, o modelo pode descobrir que o "Dia da Semana" realmente não importa muito e pode eliminar essa variável, focando apenas nas que realmente afetam o preço. Já com Regressão Ridge, ele vai manter todas as variáveis, mas com menos influência das irrelevantes.

Implementação em C# com ML.NET

Vamos implementar um exemplo simples para prever o preço de uma casa usando Regressão Lasso.

Para começar, crie um projeto Console em C#. Depois, adicione a biblioteca ML.NET através do NuGet Package.

Install-Package Microsoft.ML

Agora, na classe Program.cs, cole o código abaixo.

using System;
using System.Collections.Generic;
using Microsoft.ML;
using Microsoft.ML.Data;

namespace LassoRegressionExample
{
    public class HouseData
    {
        public float Size { get; set; }                   // Tamanho em m²
        public float Rooms { get; set; }                  // Número de quartos
        public float Bathrooms { get; set; }              // Número de banheiros
        public float Age { get; set; }                    // Idade da casa
        public float DistanceToCenter { get; set; }       // Distância até o centro
        public float NearbySupermarkets { get; set; }     // Número de supermercados próximos
        public float DayOfWeek { get; set; }              // Dia da semana em que a casa foi anunciada (0 = Domingo, 6 = Sábado)
        public float Price { get; set; }                  // Preço da casa
    }

    public class HousePricePrediction
    {
        [ColumnName("Score")]
        public float PredictedPrice { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var mlContext = new MLContext();

            var houseData = new List<HouseData>
            {
                new HouseData { Size = 50, Rooms = 2, Bathrooms = 1, Age = 10, DistanceToCenter = 5, NearbySupermarkets = 2, DayOfWeek = 1, Price = 200000 },
                new HouseData { Size = 75, Rooms = 3, Bathrooms = 2, Age = 8, DistanceToCenter = 7, NearbySupermarkets = 3, DayOfWeek = 3, Price = 300000 },
                new HouseData { Size = 100, Rooms = 4, Bathrooms = 2, Age = 5, DistanceToCenter = 10, NearbySupermarkets = 1, DayOfWeek = 2, Price = 400000 },
                new HouseData { Size = 120, Rooms = 4, Bathrooms = 3, Age = 2, DistanceToCenter = 3, NearbySupermarkets = 4, DayOfWeek = 5, Price = 600000 },
                new HouseData { Size = 200, Rooms = 5, Bathrooms = 4, Age = 1, DistanceToCenter = 8, NearbySupermarkets = 5, DayOfWeek = 0, Price = 900000 },
            };

            var dataView = mlContext.Data.LoadFromEnumerable(houseData);

            var pipeline = mlContext.Transforms.Concatenate("Features", new[] { "Size", "Rooms", "Bathrooms", "Age", "DistanceToCenter", "NearbySupermarkets", "DayOfWeek" })
                    .Append(mlContext.Regression.Trainers.LbfgsPoissonRegression(
                        labelColumnName: "Price",
                        featureColumnName: "Features",
                        l1Regularization: 0.01f,  // Regularização L1 (Lasso)
                        l2Regularization: 0f));   // Sem regularização L2 (Ridge)

            // Treina o modelo
            var model = pipeline.Fit(dataView);

            var predictionEngine = mlContext.Model.CreatePredictionEngine<HouseData, HousePricePrediction>(model);

            // Nova casa para prever o preço
            var newHouse = new HouseData
            {
                Size = 80,
                Rooms = 3,
                Bathrooms = 2,
                Age = 5,
                DistanceToCenter = 6,
                NearbySupermarkets = 2,
                DayOfWeek = 4  // Exemplo: Quinta-feira
            };

            var prediction = predictionEngine.Predict(newHouse);

            Console.WriteLine($"O preço previsto para a casa é: R$ {prediction.PredictedPrice}");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Ao executar o código acima, você verá que o sistema dará uma sugestão de preço para a casa que queremos avaliar.

Note que, no exemplo acima, estamos usando a regressão e alimentando a variável l1Regularization e l2Regularization. Cada uma delas configura o tipo Lasso ou o tipo Ridge. Experimente mudar os valores dessas variáveis, e você verá que o preço previsto para a casa irá mudar.

Para entender melhor como que isso funciona, durante o treinamento do ML, o modelo percebe que casas maiores geralmente têm preços mais altos. Ele também percebe que casas mais velhas tem um efeito contrário. Mas, o mais interessante é que ele consegue também identificar que algumas coisas, como o dia da semana em que a casa foi colocada à venda, não influencia muito no preço. Com base nisso, se o dia da semana não afeta consistentemente o preço (por exemplo, casas anunciadas em qualquer dia da semana têm preços semelhantes), a regularização L1 reduzirá o peso dessa característica para próximo de zero.

Interessante, não concorda? Então, podemos usar essas configurações para treinar melhor os nossos modelos.

Não se esqueça de que, para um ambiente real, talvez você tenha que considerar outros fatores ou fazer ajustes no código para ter um modelo mais preciso para o seu negócio.

Código fonte: GitHub

E é isso pessoal! Espero que tenham gostado :)

Abraços!

Top comments (0)