Yapay zeka özellikli BigQuery DataFrames paketini kullanarak yapılandırılmış ve yapılandırılmamış verilerden analizler elde etme

1. Genel Bakış

Bu laboratuvarda, Python kullanarak verilerden analiz elde etmek için BigQuery Studio'daki bir Python not defterinden BigQuery DataFrames'i kullanacaksınız. Yapılandırılmamış metin verilerini analiz etmek ve görselleştirmek için Google'ın üretken yapay zeka özelliğinden yararlanma

Herkese açık bir müşteri şikayetleri veritabanını kategorize edip özetlemek için Python not defteri oluşturacaksınız. Bu, yapılandırılmamış tüm metin verilerinde çalışacak şekilde uyarlanabilir.

Hedefler

Bu laboratuvarda, aşağıdaki görevleri nasıl gerçekleştireceğinizi öğreneceksiniz:

  • BigQuery Studio'da Python not defterlerini etkinleştirme ve kullanma
  • BigQuery DataFrames paketini kullanarak BigQuery'ye bağlanma
  • BigQuery ML'i ve Vertex AI'daki bir metin yerleştirme uç noktasına bağlantıyı kullanarak yapılandırılmamış metin verilerinden yerleştirmeler oluşturma
  • BigQuery ML kullanarak yerleştirmeleri kümeleme
  • BigQuery ML aracılığıyla bir LLM ile kümeleri özetleme

2. Şartlar

  • Chrome veya Firefox gibi bir tarayıcı
  • Faturalandırmanın etkin olduğu bir Google Cloud projesi

Başlamadan önce

Bu codelab'deki talimatları uygulamak için BigQuery Studio'nun etkinleştirildiği bir Google Cloud projesine ve bağlı bir faturalandırma hesabına ihtiyacınız vardır.

  1. Google Cloud Console'daki proje seçici sayfasında bir Google Cloud projesi seçin veya oluşturun.
  2. Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun. Bir projede faturalandırmanın etkin olup olmadığını kontrol etmeyi öğrenin.
  3. BigQuery Studio'yu öğe yönetimi için etkinleştirme talimatlarını uygulayın.

BigQuery Studio'yu hazırlama

Boş bir not defteri oluşturup bir çalışma zamanına bağlayın.

  1. Google Cloud Console'da BigQuery Studio'ya gidin.
  2. + düğmesinin yanındaki simgesini tıklayın.
  3. Python not defteri'ni seçin.
  4. Şablon seçiciyi kapatın.
  5. Yeni bir kod hücresi oluşturmak için + Kod'u seçin.
  6. Kod hücresinden BigQuery DataFrames paketinin en son sürümünü yükleyin.Aşağıdaki komutu yazın.
    %pip install --upgrade bigframes --quiet
    
    Kod hücresini çalıştırmak için 🞂 düğmesini tıklayın veya üst karakter + Enter tuşlarına basın.

3. Herkese açık bir veri kümesini okuma

Yeni bir kod hücresinde aşağıdakileri çalıştırarak BigQuery DataFrames paketini başlatın:

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

Not: Bu eğitimde, pandas benzeri filtreleme ile kullanıldığında daha verimli sorgulara olanak tanıyan deneysel "kısmi sıralama modu" kullanılmaktadır. Sıkı bir sıralama veya dizin gerektiren bazı pandas özellikleri çalışmayabilir.

Tüketici Şikayeti Veritabanı

Tüketici Şikayeti Veritabanı, Google Cloud'un herkese açık veri kümesi programı aracılığıyla BigQuery'de sağlanır. Bu, tüketici finansal ürünleri ve hizmetleriyle ilgili şikayetlerin bir derlemesidir ve veriler ABD Tüketici Finansal Koruma Bürosu tarafından toplanır.

BigQuery'de, Tüketici Şikayetleri Veritabanı'nı analiz etmek için bigquery-public-data.cfbp_complaints.complaint_database tablosunu sorgulayın. Bir sorgu dizesinden veya tablo kimliğinden DataFrame oluşturmak için bigframes.pandas.read_gbq() yöntemini kullanın.

"feedback" adlı bir DataFrame oluşturmak için yeni bir kod hücresinde aşağıdakileri çalıştırın:

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

DataFrame hakkında temel bilgileri keşfetme

Verilerin küçük bir örneğini indirmek için DataFrame.peek() yöntemini kullanın.

Bu hücreyi çalıştırın:

feedback.peek()

Beklenen çıkış:

  date_received                  product ... timely_response  consumer_disputed complaint_id  
0    2014-03-05  Bank account or service ...            True              False       743665   
1    2014-01-21  Bank account or service ...            True              False       678608   
2    2020-12-31          Debt collection ...            True               <NA>      4041190   
3    2014-02-12          Debt collection ...            True              False       714350   
4    2015-02-23          Debt collection ...            True              False      1251358   

Not: head() sıralama gerektirir ve bir veri örneğini görselleştirmek istiyorsanız genellikle peek()'den daha az verimlidir.

Tıpkı pandas'ta olduğu gibi, kullanılabilir tüm sütunları ve bunlara karşılık gelen veri türlerini görmek için DataFrame.dtypes özelliğini kullanın. Bunlar, pandas ile uyumlu bir şekilde gösterilir.

Bu hücreyi çalıştırın:

feedback.dtypes

Beklenen çıkış:

date_received                   date32[day][pyarrow]
product                              string[pyarrow]
subproduct                           string[pyarrow]
issue                                string[pyarrow]
subissue                             string[pyarrow]
consumer_complaint_narrative         string[pyarrow]
company_public_response              string[pyarrow]
company_name                         string[pyarrow]
state                                string[pyarrow]
zip_code                             string[pyarrow]
tags                                 string[pyarrow]
consumer_consent_provided            string[pyarrow]
submitted_via                        string[pyarrow]
date_sent_to_company            date32[day][pyarrow]
company_response_to_consumer         string[pyarrow]
timely_response                              boolean
consumer_disputed                            boolean
complaint_id                         string[pyarrow]
dtype: object

DataFrame.describe() yöntemi, DataFrame'deki bazı temel istatistikleri sorgular. Bu DataFrame sayısal sütun içermediğinden, boş olmayan değer sayısının ve farklı değerlerin sayısının özetini gösterir.

Bu hücreyi çalıştırın:

# Exclude some of the larger columns to make the query more efficient.
feedback.drop(columns=[
  "consumer_complaint_narrative",
  "company_public_response",
  "company_response_to_consumer",
]).describe()

Beklenen çıkış:

         product  subproduct    issue  subissue  company_name    state ... timely_response  consumer_disputed  complaint_id
count    3458906     3223615  3458906   2759004       3458906  3417792 ...         3458906             768399       3458906
nunique       18          76      165       221          6694       63 ...               2                  2       3458906

4. Verileri keşfetme

Gerçek şikayetlere bakmaya başlamadan önce verileri görselleştirmek için DataFrame'de pandas benzeri yöntemleri kullanın.

DataFrame'i görselleştirme

DataFrame.plot.hist() gibi çeşitli yerleşik görselleştirme yöntemleri vardır. Bu DataFrame çoğunlukla dize ve boolean verileri içerdiğinden, çeşitli sütunlar hakkında daha fazla bilgi edinmek için önce bazı toplama işlemleri yapabiliriz.

Her eyaletten kaç şikayet alındığını sayın.

complaints_by_state = (
  feedback.groupby(
    "state", as_index=False,
  ).size()
  .rename(columns={"size": "total_complaints"})
  .sort_values(by="total_complaints", ascending=False)
)

DataFrame.to_pandas() yöntemini kullanarak bunu bir pandas DataFrame'e dönüştürün.

complaints_pd = complaints_by_state.head(10).to_pandas()

İndirilen bu DataFrame'de pandas görselleştirme yöntemlerini kullanın.

complaints_pd.plot.bar(x="state", y="total_complaints")

En çok şikayet alan eyalet olarak Kaliforniya&#39;yı gösteren çubuk grafik

Diğer veri kümeleriyle birleştirme

Daha önce eyalet başına düşen şikayetlere bakıyordunuz ancak bu durumda önemli bağlam bilgileri kayboluyordu. Bazı eyaletlerin nüfusu diğerlerinden daha fazladır. ABD Nüfus Bürosu'nun Amerikan Toplum Anketi ve bigquery-public-data.geo_us_boundaries.states tablosu gibi bir nüfus veri kümesiyle birleştirin.

us_states = bpd.read_gbq("bigquery-public-data.geo_us_boundaries.states")
us_survey = bpd.read_gbq("bigquery-public-data.census_bureau_acs.state_2020_5yr")

# Ensure there are leading 0s on GEOIDs for consistency across tables.
us_states = us_states.assign(
    geo_id=us_states["geo_id"].str.pad(2, fillchar="0")
)

us_survey = us_survey.assign(
    geo_id=us_survey["geo_id"].str.pad(2, fillchar="0")
)

American Community Survey, eyaletleri GEOID'ye göre tanımlar. İki harfli eyalet koduna göre nüfusu almak için eyaletler tablosuyla birleştirin.

pops = us_states.set_index("geo_id")[["state"]].join(
  us_survey.set_index("geo_id")[["total_pop"]]
)

Şimdi, nüfusu şikayet sayısıyla karşılaştırmak için bu verileri şikayet veritabanıyla birleştirin.

complaints_and_pops = complaints_by_state.set_index("state").join(
    pops.set_index("state")
)

Eyalet nüfuslarını şikayet sayısıyla karşılaştırmak için bir dağılım grafiği oluşturun.

(
  complaints_and_pops
  .to_pandas()
  .plot.scatter(x="total_pop", y="total_complaints")
)

Nüfusu şikayetlerle karşılaştıran bir dağılım grafiği

Nüfusu şikayet sayısıyla karşılaştırdığımızda birkaç eyaletin aykırı değer olduğu görülüyor. Bunları belirlemek için nokta etiketleriyle çizim yapmak okuyucuya bırakılmıştır. Aynı şekilde, bunun neden olabileceğine dair bazı hipotezler (ör. farklı demografik gruplar, farklı sayıda finansal hizmet şirketi vb.) oluşturun ve bunları test edin.

5. Yerleştirmeleri hesaplama

Önemli bilgiler genellikle metin, ses veya resim gibi yapılandırılmamış verilerde gizlidir. Bu örnekte, şikayet veritabanındaki faydalı bilgilerin çoğu şikayetin metin içeriğinde yer alıyor.

Yapay zeka ve geleneksel teknikler (ör. duygu analizi, "kelime torbası" ve word2vec), yapılandırılmamış verilerden bazı niceliksel bilgileri ayıklayabilir. Daha yakın bir zamanda, LLM'lerle yakından ilişkili olan "vektör yerleştirme" modelleri, metnin anlamsal bilgilerini temsil eden bir kayan nokta sayıları dizisi oluşturabilir.

Veritabanının bir alt kümesini seçin

Vektör yerleştirme modeli çalıştırmak, diğer işlemlere kıyasla daha fazla kaynak kullanır. Maliyetleri ve kota sorunlarını azaltmak için bu eğitimin geri kalanında verilerin bir alt kümesini seçin.

import bigframes.pandas as bpd

bpd.options.bigquery.ordering_mode = "partial"

feedback = bpd.read_gbq(
    "bigquery-public-data.cfpb_complaints.complaint_database"
)

# Note: if not using ordering_mode = "partial", you must specify these in read_gbq
# for these to affect query efficiency.
# feedback = bpd.read_gbq(
#    "bigquery-public-data.cfpb_complaints.complaint_database",
#     columns=["consumer_complaint_narrative"],
#     filters= [
#         ("consumer_complaint_narrative", "!=", ""),
#         ("date_received", "==", "2022-12-01")])

feedback.shape

2022-12-01 tarihinde yaklaşık 1.000 şikayet gönderildi. Toplam veritabanında ise yaklaşık 3,5 milyon satır var (feedback.shape ile kontrol edin).

Yalnızca 2022-12-01 tarihine ait verileri ve yalnızca consumer_complaint_narrative sütununu seçin.

import datetime

feedback = feedback[
    # Filter rows by passing in a boolean Series.
    (feedback["date_received"] == datetime.date(2022, 12, 1))
    & ~(feedback["date_received"].isnull())
    & ~(feedback["consumer_complaint_narrative"].isnull())
    & (feedback["consumer_complaint_narrative"] != "")
    & (feedback["state"] == "CA")

    # Uncomment the following if using free credits for a workshop.
    # Billing accounts with free credits have limited Vertex AI quota.
    # & (feedback["product"] == "Mortgage")
][
    # Filter columns by passing in a list of strings.
    ["consumer_complaint_narrative"]
]

feedback.shape

Pandas'taki drop_duplicates yöntemi, eşleşen ilk veya son satırı seçip onunla ilişkili indeksi korumaya çalıştığı için satırların tamamen sıralanmasını gerektirir.

Bunun yerine, satırları tekilleştirmek için groupby yöntemine yapılan bir çağrıyla toplayın.

feedback = (
  feedback.groupby("consumer_complaint_narrative", as_index=False)
  .size()
)[["consumer_complaint_narrative"]]

feedback.shape

Yerleştirilmiş öğeler oluşturma

BigQuery DataFrames, TextEmbeddingGenerator sınıfı aracılığıyla yerleştirme vektörleri oluşturur. Bu, BigQuery ML'de Vertex AI tarafından sağlanan metin yerleştirme modellerini çağıran ML.GENERATE_EMBEDDING yöntemine dayanır.

from bigframes.ml.llm import TextEmbeddingGenerator

embedding_model = TextEmbeddingGenerator(
    model_name="text-embedding-004"
)
feedback_embeddings = embedding_model.predict(feedback)

Yerleştirilmiş içeriklerin nasıl göründüğüne göz atın. Bu vektörler, metin yerleştirme modeli tarafından anlaşıldığı şekliyle metnin semantik anlamını temsil eder.

feedback_embeddings.peek()

Beklenen çıkış:

                        ml_generate_embedding_result  \
0  [ 7.36380890e-02  2.11779331e-03  2.54309829e-...   
1  [-1.10935252e-02 -5.53950183e-02  2.01338865e-...   
2  [-7.85628427e-03 -5.39347418e-02  4.51385677e-...   
3  [ 0.02013054 -0.0224789  -0.00164843  0.011354...   
4  [-1.51684484e-03 -5.02693094e-03  1.72322839e-...   

Bu vektörlerin birçok boyutu vardır. Tek bir yerleştirme vektörüne göz atın:

feedback_embeddings["ml_generate_embedding_result"].peek().iloc[0]

Yerleştirme oluşturma işlemi "kısmi başarı" sözleşmesi kapsamında yapılır. Bu nedenle bazı satırlarda hata olabilir ve yerleştirme oluşturulmayabilir. Hata mesajları 'ml_generate_embedding_status' sütununda gösterilir. Boş olması hata olmadığı anlamına gelir.

Yerleştirmeleri yalnızca hata oluşmayan satırları içerecek şekilde filtreleyin.

mask = feedback_embeddings["ml_generate_embedding_status"] == ""
valid_embeddings = feedback_embeddings[mask]
valid_embeddings.shape

6. Metin yerleştirmelerini kullanarak kümeleme

Şimdi k-ortalama kullanarak yerleştirmeleri kümeleyin. Bu demo için rastgele sayıda grup (diğer adıyla merkezoid) kullanın. Üretim kalitesinde bir çözüm, Silhouette yöntemi gibi bir teknik kullanarak centroid sayısını ayarlamalıdır.

from bigframes.ml.cluster import KMeans

num_clusters = 5
cluster_model = KMeans(n_clusters=num_clusters)
cluster_model.fit(valid_embeddings["ml_generate_embedding_result"])
clusters = cluster_model.predict(valid_embeddings)
clusters.peek()

Tüm yerleştirme hatalarını kaldırın.

mask = clusters["ml_generate_embedding_status"] == ""
clusters = clusters[mask]

Merkez noktası başına yorum dağılımını inceleyin.

clusters.groupby("CENTROID_ID").size()

7. Kümeleri özetleme

Her bir merkez noktayla ilişkili bazı yorumları girin ve Gemini'dan şikayetleri özetlemesini isteyin. İstem mühendisliği yeni gelişen bir alan olsa da internette https://www.promptingguide.ai/ gibi iyi örnekler bulunmaktadır.

from bigframes.ml.llm import GeminiTextGenerator

preamble = "What is the main concern in this list of user complaints:"
suffix = "Write the main issue using a formal tone."

# Now let's sample the raw comments and get the LLM to summarize them.
prompts = []
for centroid_id in range(1, num_clusters + 1):
  cluster = clusters[clusters["CENTROID_ID"] == centroid_id]
  comments = "\n".join(["- {0}".format(x) for x in cluster.content.peek(40)])
  prompts.append("{}:\n{}\n{}".format(preamble, comments, suffix))

prompt_df = bpd.DataFrame(prompts)
gemini = GeminiTextGenerator(model_name="gemini-1.5-flash-001")
issues = gemini.predict(X=prompt_df, temperature=0.0)
issues.peek()

Özetlerden rapor yazmak için Gemini'ı kullanma

from IPython.display import display, Markdown

prompt = "Turn this list of issues into a short, concise report:"
for value in issues["ml_generate_text_llm_result"]:
  prompt += "- {}".format(value)
prompt += "Using a formal tone, write a markdown text format report."

summary_df = bpd.DataFrame(([prompt]))
summary = gemini.predict(X=summary_df, temperature=0.0)

report = (summary["ml_generate_text_llm_result"].values[0])
display(Markdown(report))

8. Temizleme

Bu eğitim için yeni bir Google Cloud projesi oluşturduysanız oluşturulan tablolar veya diğer kaynaklar için ek ücret alınmasını önlemek üzere bu projeyi silebilirsiniz.

9. Tebrikler!

BigQuery DataFrames'i kullanarak yapılandırılmış ve yapılandırılmamış verileri analiz etmiş olmanız gerekir. Bu süreçte Google Cloud'un herkese açık veri kümelerini, BigQuery Studio'daki Python not defterlerini, BigQuery ML'i, Vertex AI'ı ve BigQuery Studio'nun doğal dilden Python'a özelliklerini keşfettiniz. Tebrikler!

Sonraki adımlar